[C#] DataGridView에서 콤보박스 컬럼을 사용하기
1. DataGridView에 콤보박스 속성 추가하기

2. DataGridView의 속성 설정하기

3. DataGridView의 이벤트 추가하기
- 외부데이터 구문분석 또는 유효성검사 작업에서 예외를 throw하거나
데이터소스에 데이터를 커밋하려는 시도가 실패했을 발생하는 이벤트이다.
이 이벤트를 추가하지 않으면 각종 이벤트가 발생할 때마다 오류메시지가 표시되고 정상적으로 작동하지않는다.
grdData.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler(grdData_DataError);
private void grdData_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
e.Cancel = true;
}
- 콤보박스에 이벤트를 추가하거나 추가적인 작업을 하려면
CellBeginEdit 또는 CellEndEdit, EditingControlShowing 이벤트를 사용하면 된다.
CellBeginEdit : 콤보박스 셀에 대한 편집모드가 시작될 때 발생한다.
CellEndEdit : 콤보박스 셀에 대한 편집모드가 중지될 때 발생한다.
EditingControlShowing : 콤보박스 셀 편집을 위한 컨트롤이 표시될 때 발생한다.
예를들면 아래처럼 기능을 추가할 수 있다.
private void grdData_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control != null)
{
ComboBox comboBox = (ComboBox)e.Control;
comboBox.SelectedIndexChanged -= Combo_SelectedIndexChanged;
comboBox.SelectedIndexChanged += Combo_SelectedIndexChanged;
Debug.WriteLine($"{comboBox.Items}");
}
}
콤보박스의 선택 항목이 변경되었을 때 추가작업을 할 수 있다.
private void Combo_SelectedIndexChanged(object sender, EventArgs e)
{
}
4. DataGridView의 데이터소스에 데이터개체를 연동한 예제
public class TestComboData
{
public string CD { get; set; } = "";
public string NM { get; set; } = "";
public string COR1 { get; set; } = "";
public string COR2 { get; set; } = "";
public string COR3 { get; set; } = "";
public override string ToString()
{
return NM;
}
}
List<TestComboData> dtCb = new List<TestComboData>();
private void Form2_Load(object sender, EventArgs e)
{
Cursor.Current = Cursors.WaitCursor;
Random rd = new Random();
for (int i = 0; i < 10; ++i)
{
int idx = rd.Next(1, 100);
dtCb.Add(new TestComboData()
{
CD=$"CD{idx}",
NM=$"NM{idx}",
COR1 = $"국어{idx}",
COR2 = $"수학{idx}",
COR3 = $"과학{idx}",
});
}
var cbo = (DataGridViewComboBoxColumn)grdData.Columns["COMBO"];
cbo.DisplayMember = "NM";
cbo.ValueMember = "CD";
cbo.DataSource = dtCb;
List<TestData> dt = new List<TestData>();
for (int i = 0; i < 10000; ++i)
{
int idx = rd.Next(0, 9);
dt.Add(new TestData()
{
CHK = rd.Next(1, 1000) % 2 == 0,
IDX = idx.ToString(),
NAME = $"NAME{idx}",
COMBO = dtCb[idx].CD,
});
}
grdData.DataSource = dt;
Cursor.Current = Cursors.Default;
}
5. 결과물
