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; { 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; } } |
'스터디 > C#.NET:자료' 카테고리의 다른 글
C# TextBox 전화번호만 받기(숫자, -만 받기) (0) | 2010.11.15 |
---|---|
C# 다른 2개의 폼 – 체크 박스 이벤트 연결 (0) | 2010.11.15 |
객체 지향 (패키지화, 상속)에 대해서 (0) | 2010.11.15 |
다른 폼의 데이터 제어/변경하기 (0) | 2010.11.06 |
런타임에러, 예외 처리 방법, try catch (0) | 2010.10.31 |
C# 에서 string 관련 (0) | 2010.10.22 |
TreeView 이용하기 (1) | 2010.10.18 |
프로그램을 트레이 아이콘으로 보내기 (0) | 2010.10.11 |
FlagsAttribute Class (0) | 2010.10.09 |
레지스트리 변경 이벤트 (0) | 2010.10.08 |