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

}

 

 

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이 오픈 되지 않아 생기는 에러 입니다.

+ Recent posts