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;

}

}

 원문 : http://whiteat.com/39181 

 

+ Recent posts