폼에서 ESC 눌렀을 때 화면 종료되도록 하기 입니다.

 

#region ProcessCmdKey(msg, keyData)
			
/// ESC 키 입력시 종료합니다.
/// </summary>
/// <param name="msg"></param>
/// <param name="keyData"></param>
/// <returns></returns>
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
	if(keyData == Keys.Escape)
	{ 
		this.Close();
		return true;
	}
	return base.ProcessCmdKey(ref msg, keyData);
}
#endregion

로그인 화면에서 패스워드 입력 루 엔터키 눌렀을 때 로그인 되도록 할 수 있습니다.

 

private void passwordTextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        this.loginButton_Click(sender, e);
    }
}

 

해쉬코드 생성하는 메서드 입니다.(HashCode)

 

public string PassHash(string data)
{ 
	SHA1 sha = SHA1.Create();
	byte[] hashData = sha.ComputeHash(Encoding.Default.GetBytes(data));
	StringBuilder returnValue = new StringBuilder();

	for (int i = 0; i < hashData.Length; i++)
	{
		returnValue.Append(hashData[i].ToString());
	}

	return returnValue.ToString();

}

TextBox에 텍스트 입력 시 기호로 출력되게 하기 입니다.

this.passwordTextBox.Text = "";
this.passwordTextBox.PasswordChar = '*';
this.passwordTextBox.MaxLength = 14;

 

 

DataGridView에서 마우스 우클릭시 메뉴 아이템 출력되도록 합니다.

 

메뉴에는 추가, 수정, 삭제가 존재 합니다.

 

아래와 코드와 같은 이벤트 발생 코드를 작성합니다.

#region mainGridView_CellContextMenuStripNeeded(sender, e)

/// <summary>
/// 셀의 바로가기 메뉴가 필요할 때 발생합니다.
/// </summary>
/// <param name="sender">이벤트 발생자 입니다.</param>
/// <param name="e">이벤트 인자 입니다.</param>
private void mainGridView_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e)
{
	if (e.RowIndex > -1 && e.ColumnIndex > -1)
	{
		this.mainGridView.CurrentCell = this.mainGridView.Rows[e.RowIndex].Cells[e.ColumnIndex];
		e.ContextMenuStrip = GetContextMenuStrip();
	}
}

#endregion

 

이전 포스트에도 있던 컨텍스트 메뉴 스트립 소스 입니다.

 

#region GetContextMenuStrip()

/// <summary>
/// 컨텍스트 메뉴 스트립을 가져옵니다.
/// </summary>
/// <returns>컨텍스트 메뉴 스트립을 리턴합니다.</returns>
private ContextMenuStrip GetContextMenuStrip()
{
        ContextMenuStrip contextMenuStrip = new ContextMenuStrip();

        ToolStripMenuItem addItem    = new ToolStripMenuItem("추가");
        ToolStripMenuItem updateItem = new ToolStripMenuItem("수정");
        ToolStripMenuItem deleteItem = new ToolStripMenuItem("삭제");

        contextMenuStrip.Items.AddRange(new ToolStripItem[]
        {
                addItem,
                updateItem,
                deleteItem
        });

        addItem.Click	 += addItem_Click;
        updateItem.Click += updateItem_Click;
        deleteItem.Click += deleteItem_Click;

        return contextMenuStrip;

}

#endregion

ContextMenuStrip를 사용하여  ContextMenuStrip 팝업 메뉴 만들기 입니다.

 

팝업 메뉴에 추가, 수정, 삭제가 있습니다.

 

private ContextMenuStrip GetContextMenuStrip()
{
	ContextMenuStrip contextMenuStrip = new ContextMenuStrip();

	ToolStripMenuItem addItem    = new ToolStripMenuItem("추가");
	ToolStripMenuItem updateItem = new ToolStripMenuItem("수정");
	ToolStripMenuItem deleteItem = new ToolStripMenuItem("삭제");

	contextMenuStrip.Items.AddRange(new ToolStripItem[]
	{
		addItem,
		updateItem,
		deleteItem
	});

	addItem.Click	 += addItem_Click;
	updateItem.Click += updateItem_Click;
	deleteItem.Click += deleteItem_Click;

	return contextMenuStrip;

}

 

 

Ambiguous column name 에러 문구가 출력될 경우에는

 

두개의 테이블에서 같은 컬럼이 있을 경우

 

예를 들어 A 테이블에 CREATEDATE B 테이블에도 CREATEDATE 가 있으며

두개의 테이블을 JOIN 했을 때

출력할 때 어떤 테이블의 CREATEDATE를 출력할지를 정해야 합니다.

A.CREATEDATE 와 같은 방법으로 정해야 에러 발생하지 않습니다.

C# / SQLITE 에서 SQLITE 쿼리의 이름 중에 CREATEDATE1 과 같이 영어와 숫자 같이 있을 때 문제점이 있는 것 같다.

 

쿼리문에서 날짜 범위 설정 하려할 때

 

아래와 같은 쿼리문이 있습니다.

(A.CREATETIME BETWEEN @CREATETIME1 AND @CREATETIME2 + 1)

CREATETIME2에 하루를 더하려고 하는데

 

'2' 가 붙어 있어서인지 CREATETIME2를 인식을 못하는듯 합니다.

 

지금은 CREATETIME2와 같이 영어 숫자를 조합하기 보다는 TODATE와 같은 방식으로 작성하였습니다.

 

위의 그림과 같이 Database is not open 이라는 에러가 발생했을 때의 해결 방법 입니다.

 

using (SQLiteConnection connection = new SQLiteConnection(connectionString))

아래의 코드에 connection.Open()이라는 코드를 추가해주면 됩니다.

 

즉 connection이 오픈 되지 않아 생기는 에러 입니다.

DataGridView에 데이터 삭제하는 메서드 입니다

 

삭제 시 데이터소스를 null로 변경 후

 

다시 새로운 데이터 소스를 삽입합니다.

 

그래야 삭제 시 에러 발생 안됨

 

혹은  e.Cancel = true로 설정하는데 이 항목은 테스트 안해봤음

 

#region mainDeleteButton_Click(sender, e)

		/// <summary>
		/// 삭제 버튼 클릭시 동작합니다.
		/// </summary>
		/// <param name="sender">이벤트 발생자 입니다.</param>
		/// <param name="e">이벤트 인자 입니다.</param>
		private void mainDeleteButton_Click(object sender, EventArgs e)
		{
			foreach (DataGridViewRow row in this.mainGridView.SelectedRows)
			{
				MainModel focusItem = row.DataBoundItem as MainModel;

				if(focusItem == null)
				{
					MessageBox.Show("삭제할 항목이 없습니다.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
					return;
				}
				if (MessageBox.Show("해당 항목을 삭제하시겠습니까?", "Confirmation", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel)
				{
					return;
				}

				try
				{
					SetMainDataGridView(null);

					QueryHelper.DeleteItem(focusItem.ID);

					//this.sourceList.Remove(focusItem);

					SetMainDataGridView(this.sourceList);

				}
				catch (Exception exception)
				{
					MessageBox.Show(exception.ToString());
				}
				finally
				{
					SetEditMode(EditMode.Normal);

					UpdateMainControlData(focusItem);
				}

			}
		}

		#endregion

+ Recent posts