폼에서 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);
    }
}

 

TaskManager 할일 관리 프로그램 입니다.

 

상단에 있는 그리드에서는 큰 목록의 할일이며

 

하단에 있는 그리드는 세부 내용 관련 그리드 입니다.

 

세부 내용 관련 그리드에서는 제목 / 내용 / 파일 첨부를 할 수 있습니다.

세부 내용의 첨부된 파일 이름을 클릭 시 해당 파일이 실행됩니다.

 

회원등록 및 로그인 기능도 완료하였으나 암호화 과정에서 예기치 않은 에러가 발생하여 수정중에 있습니다.

 

C# Winform 으로 개발하였으며 DB는 SQLite 입니다.

 

TaskManger 메인 화면
TaskManager.7z
1.89MB

 

해쉬코드 생성하는 메서드 입니다.(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;

}

 

 

위의 그림과 같이 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

DataGridView에서 선택한 행의 객체 가져오기 입니다.

 

foreach (DataGridViewRow row in this.mainGridView.SelectedRows)
{
	MainModel item = row.DataBoundItem as MainModel;

	UpdateMainControlData(item);
}

 

+ Recent posts