- 전체
- Form
- Image/Picture/Icon
- Enviroment
- string
- File/Directory
- Menu
- windows
- Net
- DataBase
- LINQ
- Event
- DateTime
- General
- 에러해결
- 그외
- 정리예정
ListView ListView 에 ComboBox 붙이기
2010.10.28 15:50
http://whiteat.com/33283 에 내용을 추가했습니다. 리스트뷰에 콤보박스 붙이는 방법은 여러 가지가 있지만 최대한 재사용을 위해 상위 클래스를 상속받아 새로운 클래스를 만들어 보겠습니다.
< 1번 빨강을 빨간색으로 되어 있는지 확인한다. >
< 1번 빨강을 선택한 후 더블 클릭하여 파랑을 선택한다. >
< 1번 파랑으로 변경되고 글자색도 파란색으로 변경되었다. >
◆ ListView를 상속하여 WATListView 클래스 만들기
// 이벤트에사용할아규먼트 public class WATListComboEventArgs : EventArgs { int iLastX = 0; public int LastX { get { return iLastX; } set { iLastX = value; } }
int iLastY = 0; public int LastY { get { return iLastY; } set { iLastY = value; } }
int iSelectSubItem = 0; public int SelectSubItem { get { return iSelectSubItem; } set { iSelectSubItem = value; } }
System.Windows.Forms.ListViewItem m_SelectedItem; public System.Windows.Forms.ListViewItem SelectedItem { get { return m_SelectedItem; } set { m_SelectedItem = value; } }
ComboBox m_combobox; public System.Windows.Forms.ComboBox Combobox { get { return m_combobox; } set { m_combobox = value; } }
bool bCanceled = true; public bool Canceled { get { return bCanceled; } set { bCanceled = value; } }
}
public class WATListView : System.Windows.Forms.ListView { WATListComboEventArgs m_lvwComboArgs = new WATListComboEventArgs();
public delegate void eventComboChanged(WATListComboEventArgs e); public event eventComboChanged ComboChanged;
readonly int MAX_COMBO_COUNT = 10; string subItemText = ""; /// <summary> 콤보상자데이터가변경되었을때리스트값도변경할것인가? /// </summary> bool bComboToList = false; public bool ComboToList { get { return bComboToList; } set { bComboToList = value; } }
private System.Windows.Forms.ComboBox[] cboData ;//= new System.Windows.Forms.ComboBox[MAX_COMBO_COUNT];
public WATListView() { cboData = new System.Windows.Forms.ComboBox[MAX_COMBO_COUNT]; for (int iTemp = 0; iTemp < MAX_COMBO_COUNT;iTemp++ ) { this.cboData[iTemp] = new System.Windows.Forms.ComboBox(); this.cboData[iTemp].Hide(); this.cboData[iTemp].SelectedIndexChanged += new EventHandler(WATListView_SelectedIndexChanged); this.cboData[iTemp].LostFocus += new EventHandler(WATListView_LostFocus); this.cboData[iTemp].KeyDown += new KeyEventHandler(WATListView_KeyDown); this.cboData[iTemp].DropDownStyle = ComboBoxStyle.DropDownList; this.Controls.Add(cboData[iTemp]); }
this.FullRowSelect = true; this.DoubleClick +=new EventHandler(WATListView_DoubleClick); this.MouseDown += new System.Windows.Forms.MouseEventHandler(WATListView_MouseDown); }
void WATListView_KeyDown(object sender, KeyEventArgs e) { ComboBox cb = sender as ComboBox;
if (e.KeyValue == 13) { m_lvwComboArgs.Canceled = false; if (null != ComboChanged) ComboChanged(m_lvwComboArgs); } else { m_lvwComboArgs.Canceled = true; }
if (e.KeyValue == 13 || e.KeyValue == 27) { cb.Hide(); // Lost Focus 가호출된다. } }
void WATListView_LostFocus(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; cb.Hide(); // 이거없애도되나? if (!m_lvwComboArgs.Canceled) { if (this.ComboToList) { string str = m_lvwComboArgs.Combobox.Text; m_lvwComboArgs.SelectedItem.SubItems[m_lvwComboArgs.SelectSubItem].Text = str;
}
if (null != ComboChanged) ComboChanged(m_lvwComboArgs); } }
void WATListView_SelectedIndexChanged(object sender, EventArgs e) { m_lvwComboArgs.Canceled = false; m_lvwComboArgs.Combobox = sender as ComboBox; }
void WATListView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { m_lvwComboArgs.SelectedItem = this.GetItemAt(e.X, e.Y); m_lvwComboArgs.LastX = e.X; m_lvwComboArgs.LastY = e.Y; }
void WATListView_DoubleClick(object sender, EventArgs e) { int start = m_lvwComboArgs.LastX; int position = 0; int end = 0; // for (int i = 0; i < this.Columns.Count; i++) { end += this.Columns[i].Width; if (start > position && start < end) { m_lvwComboArgs.SelectSubItem = i; break; }
position = end;
}
if (this.cboData[m_lvwComboArgs.SelectSubItem].Items.Count <= 0) return;
subItemText = this.m_lvwComboArgs.SelectedItem.SubItems[m_lvwComboArgs.SelectSubItem].Text; Trace.Write("SelectSubItem : " + m_lvwComboArgs.SelectSubItem.ToString() + subItemText);
this.cboData[m_lvwComboArgs.SelectSubItem].Size = new System.Drawing.Size(end - position, this.m_lvwComboArgs.SelectedItem.Bounds.Bottom - this.m_lvwComboArgs.SelectedItem.Bounds.Top); this.cboData[m_lvwComboArgs.SelectSubItem].Location = new System.Drawing.Point(position, m_lvwComboArgs.SelectedItem.Bounds.Y); this.cboData[m_lvwComboArgs.SelectSubItem].Show(); this.cboData[m_lvwComboArgs.SelectSubItem].Text = subItemText; this.cboData[m_lvwComboArgs.SelectSubItem].SelectAll(); this.cboData[m_lvwComboArgs.SelectSubItem].Focus(); }
public void AddString(int iSubItem, string [] strData) { cboData[iSubItem].Items.AddRange(strData); }
} } |
◆ WATListView 사용하기
먼저 디자인 뷰에서 ListView 로 사용된 리스트뷰를 WATListView 로 교체하고 콤보박스 값이 변경되었을 때의 이벤트를 추가합니다.
this.lvwColor.ComboChanged += new WATListView.eventComboChanged(lvwColor_ComboChanged); |
콤보박스 값이 변경되었을 리스트의 값도 변경해줘야 하는데 ComboToList =true 을 사용하여 자동으로 처리되게 합니다.
그리고 콤보박스에 넣을 데이터를 추가합니다.
List<string> strItem = new List<string>(); strItem.Add("빨강"); strItem.Add("노랑"); strItem.Add("파랑"); strItem.Add("초록"); this.lvwColor.AddString(열 번호, strItem.ToArray());
|
콤보박스 값이 변경되었을 때의 함수를 만듭니다.
void lvwColor_ComboChanged(WATListComboEventArgs e) { Trace.Write("lvwColor_ComboChanged : " + e.Combobox.Text);
switch (e.Combobox.Text) { case "빨강": e.SelectedItem.ForeColor = Color.Red; break; case "노랑": e.SelectedItem.ForeColor = Color.Yellow; break; case "파랑": e.SelectedItem.ForeColor = Color.Blue; break; case "초록": e.SelectedItem.ForeColor = Color.Green; break; } } |
- [2018/02/26] List 에서 고유값 얻기 (4027)
- [2016/09/24] XML 으로 환경설정 저장하기 ( \n,엔터값 포함, NewLine) (9667)
- [2015/05/22] C#, 아두이노 간의 WIFI 통신으로 LCD 제어 (4565)
- [2015/03/13] 항상 마지막에 추가한 TEXT 보이게 (15782)
- [2014/11/27] 블루투스 장치 추가 (4409)
- [2014/01/17] ComboBox Text 편집 안되게 ()
- [2014/01/08] if 문에서 여러개 비교할때 (25339) *3
- [2013/12/30] C++, C# 간단한 기능 비교 (12884)
- [2013/12/18] 3자리마다 ,(콤마) 찍기 (원화, 달러 표시) (15224)
- [2013/09/29] 설치된 IE 버전 얻기 (12397)