반응형
위와 같이 리스트뷰에 텍스트 박스를 넣어서 편집을 하는 경우이다.
아래는 리스트뷰에 텍스트 박스를 넣기위한, 리스트뷰 디자이너쪽 프로퍼티와
리스트뷰 이벤트 1개, 텍스트 박스 이벤트 2개 소스.
//리스트뷰의 기본 생성 디자이너쪽
this.FileListView.CheckBoxes = true;
this.FileListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.col_No,
this.col_pageCnt,
this.col_FileName,
this.col_printTime});
this.FileListView.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.FileListView.FullRowSelect = true;
this.FileListView.GridLines = true;
this.FileListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.FileListView.HideSelection = false;
this.FileListView.Location = new System.Drawing.Point(6, 56);
this.FileListView.MultiSelect = false;
this.FileListView.Name = "FileListView";
this.FileListView.Size = new System.Drawing.Size(291, 402);
this.FileListView.TabIndex = 6;
this.FileListView.UseCompatibleStateImageBehavior = false;
this.FileListView.View = System.Windows.Forms.View.Details;
this.FileListView.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.FileListView_MouseDoubleClick);
this.txt_etc.Location = new System.Drawing.Point(665, 39);
this.txt_etc.Name = "txt_etc";
this.txt_etc.Size = new System.Drawing.Size(89, 21);
this.txt_etc.TabIndex = 18;
this.txt_etc.Visible = false;
this.txt_etc.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txt_etc_KeyDown);
this.txt_etc.Leave += new System.EventHandler(this.txt_etc_Leave);
당연 디테일뷰와 총 4개의 Columns (SubItem)을 갖게 해놨으며, 텍스트 박스와 리스트뷰 각각 이벤트를 연결해놓았다. private bool _cancelEdit = false; ListViewItem curItem; ListViewItem.ListViewSubItem curSbItem;멤버 변수 참고
private void FileListView_MouseDoubleClick(object sender, MouseEventArgs e)
{
//위치기반으로 어느 Item과 어느 subitem을 떠블클릭한건지 확인
curItem = FileListView.GetItemAt(e.X, e.Y);
if (curItem == null)
return;
int idxRow = FileListView.Items.IndexOf(curItem);
curSbItem = curItem.GetSubItemAt(e.X, e.Y);
int idxSub = curItem.SubItems.IndexOf(curSbItem);
//비고쪽을 떠블클릭한 것이 아니라면 Return
switch (idxSub)
{
case 0: //순번
case 1: //서식명
case 3: //시간
case 4: //서식코드
case 5: //파일명
return;
case 2: //비고
break;
default: //N/A
return;
}
//해당 셀의 위치로 텍스트박스를 이동
int left = curSbItem.Bounds.Left + 2;
int width = curSbItem.Bounds.Width;
txt_etc.SetBounds(left + FileListView.Left + ImageListBox.Left,
curSbItem.Bounds.Top + FileListView.Top + ImageListBox.Top,
width, curSbItem.Bounds.Height);
//비고란에 데이타가 없으면(처음입력),
if (string.IsNullOrEmpty(curSbItem.Text))
{
//윗줄에 비고값 확인
if (idxRow > 0 && FileListView.Items[idxRow - 1].SubItems[2].Text != "")
//있으면, 기본값은 윗줄의 비고값입력
txt_etc.Text = FileListView.Items[idxRow - 1].SubItems[2].Text;
else
//없으면, 기본값은 공란
txt_etc.Text = "";
}
else
{
txt_etc.Text = curSbItem.Text;
}
txt_etc.Show();
txt_etc.Focus();
}
private void txt_etc_KeyDown(object sender, KeyEventArgs e)
{
switch(e.KeyCode)
{
case System.Windows.Forms.Keys.Enter:
e.Handled = true;
_cancelEdit = false;
txt_etc.Hide();
break;
case System.Windows.Forms.Keys.Escape:
e.Handled = true;
_cancelEdit = true;
txt_etc.Hide();
break;
default:
return;
}
}
private void txt_etc_Leave(object sender, EventArgs e)
{
txt_etc.Hide();
if (!_cancelEdit)
{
curSbItem.Text = txt_etc.Text;
}
_cancelEdit = false; // re init
FileListView.Focus();
//txt_etc.Hide();
//if (_cancelEdit == false)
//{
// if (txt_etc.Text.Trim() != "")
// {
// curSbItem.Text = txt_etc.Text;
// //int idxSub = curItem.SubItems.IndexOf(curSbItem);
// //int idx = curItem.Index;
// }
//}
}
반응형
'I.T > Programming' 카테고리의 다른 글
| [C#] cmd창 안보이게, hidden 처리 (0) | 2022.07.15 |
|---|---|
| [C#] Ldap Server User 인증하기 (0) | 2016.11.10 |
| [C#] Get HashString, from File Strem (0) | 2016.11.10 |
| [Custom URI] Custom URI 적용(경고창제어), NSIS Custom URI 적용하기 (Windows & Explorer 예제, C#, NSIS Script) (0) | 2016.07.15 |
| Windbg 윈디버그 실행하여 crash dump 확인하기(pdb symbol) Visual Studio 2010 (0) | 2015.10.27 |
