메뉴 바로가기

서브메뉴 바로가기

본문 바로가기

logo

C# .NET 자료실

ListView ListView 에 ComboBox 붙이기

2010.10.28 15:50

WhiteAT 조회 수:22588

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; //this.Columns[0].Width;

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;

}

}

 

 

관련 문서가 검색되었습니다.
  1. [2018/02/26] List 에서 고유값 얻기 by WhiteAT (4027)
  2. [2016/09/24] XML 으로 환경설정 저장하기 ( \n,엔터값 포함, NewLine) by WhiteAT (9667)
  3. [2015/05/22] C#, 아두이노 간의 WIFI 통신으로 LCD 제어 by WhiteAT (4565)
  4. [2015/03/13] 항상 마지막에 추가한 TEXT 보이게 by WhiteAT (15782)
  5. [2014/11/27] 블루투스 장치 추가 by WhiteAT (4409)
  6. [2014/01/17] ComboBox Text 편집 안되게 by WhiteAT ()
  7. [2014/01/08] if 문에서 여러개 비교할때 by WhiteAT (25339) *3
  8. [2013/12/30] C++, C# 간단한 기능 비교 by WhiteAT (12884)
  9. [2013/12/18] 3자리마다 ,(콤마) 찍기 (원화, 달러 표시) by WhiteAT (15224)
  10. [2013/09/29] 설치된 IE 버전 얻기 by WhiteAT (12397)