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 = this.Columns[0].Width;
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;
end += this.Columns[i].Width;
}
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;
}
}