유용한 정보

[C#] DataGridView에서 콤보박스 컬럼을 사용하기

DevReff 2025. 6. 24. 23:09
728x90
728x90
SMALL

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. 결과물

728x90
728x90
LIST