EMDI는 지금도 개발중

C# : 대분류 콤보박스 변경 시 소분류 데이터 변경 How to change DataGridViewComboBoxCell value in C# 본문

언어/C#

C# : 대분류 콤보박스 변경 시 소분류 데이터 변경 How to change DataGridViewComboBoxCell value in C#

EMDI 2019. 5. 8. 21:24

이번 글은 C# 숙제를 하던 중 막혔던 콤보박스 값 변경입니다. 현재 저는 C#으로 블로그만들기를 하고 있습니다. 해당 프로젝트는 회사 내부 프로젝트가 아닌 그냥 개인적으로 C# 공부를 하기 위해 만든 미니 프로젝트입니다.

 

사진을 보시면 알 수 있듯이 저는 DataGridView 안에 대분류 콤보박스와 소분류 콤보박스를 만들었습니다. 대분류와 소분류는 MENU_INFO 테이블에 있는 데이터를 갖고 세팅합니다.

 

 

위의 사진은 MENU_INFO 테이블입니다. MENU_TYPE_NM은 대분류, MENU_NM은 소분류로 구분하여 만들었습니다. 해당 내용은 네이버 블로그와 동일하게 이 카테고리가 어떤 테마를 갖고있는 카테고리인지를 알기 위해 만들었습니다.

private void gridMenuList_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
{ 
    // 대분류가 변경되면 소분류 선택 filter 걸기 
    if (gridMenuList.Rows.Count > 0) 
    { 
        // MENU_TYPE_NM 변경 시 대분류 
        if (e.ColumnIndex.Equals(3)) 
        { 
			gridMenuList.Rows[e.RowIndex].Cells["MENU_TYPE_ID"].Value = gridMenuList.Rows[e.RowIndex].Cells["MENU_TYPE_NM"].Value; 

            // 대분류가 변경되면 소분류도 변경되도록 수정. 
            DataTable dtTemp = new DataTable(); 
            dtTemp = _dtComboList.Copy(); 
            dtTemp.DefaultView.RowFilter = "MENU_TYPE_ID = '" + gridMenuList.Rows[e.RowIndex].Cells["MENU_TYPE_ID"].Value + "'"; 

            DataGridViewComboBoxCell newCombo = new DataGridViewComboBoxCell(); 
            newCombo.DataSource = dtTemp.DefaultView.ToTable(true, new string[] { "MENU_NM", "MENU_ID" }); 
            newCombo.DisplayMember = "MENU_NM"; 
            newCombo.ValueMember = "MENU_ID"; 
            gridMenuList.Rows[e.RowIndex].Cells["MENU_NM"] = newCombo; 

            // 기존 데이터는 초기화 
            gridMenuList.Rows[e.RowIndex].Cells["MENU_ID"].Value = ""; 
		} 
        // MENU_NM 변경 시 소분류 
        else if (e.ColumnIndex.Equals(5)) 
        { 
            gridMenuList.Rows[e.RowIndex].Cells["MENU_ID"].Value = gridMenuList.Rows[e.RowIndex].Cells["MENU_NM"].Value; 

        } 
	} 
}

메소드 통째로 보면 더 보기 쉬울 수 있을 듯하여 같이 올려놓았습니다. 우선 저는 DataGridView의 Cell Value가 변경될 때마다 해당 메소드를 타고 들어오게 이벤트를 걸어놓았습니다. 그 다음 변경된 e.ColumnIndex가 3인 대분류 Cell이 변경되었을 때는 해당 대분류에 포함된 소분류만 보여줄 수 있도록 변경합니다.

 

우선 MENU_INFO의 데이터가 다 들어있는 dtComboList(DataTable)을 임시 DataTable인 dtTemp에 붙여넣습니다.

dtTemp.DefaultView.RowFilter = "MENU_TYPE_ID = '" + gridMenuList.Rows[e.RowIndex].Cells["MENU_TYPE_ID"].Value + "'";

그 다음 똑같은 데이터가 들어있는 dtTemp에 RowFilter를 사용하여 선택했던 대분류의 value를 갖고 있는 데이터만 들어가도록 설정합니다.

만약 RowFilter로 필요한 데이터만 있는 DataTable을 바로 DataGridView에 넣으시려고 하면 넣을 수는 있지만 원하는 형태처럼 안나올겁니다. 저도 각각의 Row마다 선택한 대분류에 맞춰 소분류가 나와야하는데 무작정 DataTable을 넣으려고 하면 모든 Row다 다 똑같이 변하더라고요ㅠㅠ 소분류의 콤보박스를 Row마다 변경하게끔 만드시려면 따로 새로운 콤보박스 생성자를 만들어야합니다.

DataGridViewComboBoxCell newCombo = new DataGridViewComboBoxCell(); 
newCombo.DataSource = dtTemp.DefaultView.ToTable(true, new string[] { "MENU_NM", "MENU_ID" }); 
newCombo.DisplayMember = "MENU_NM"; 
newCombo.ValueMember = "MENU_ID"; 

gridMenuList.Rows[e.RowIndex].Cells["MENU_NM"] = newCombo;

위의 소스처럼 적용하면 각 Row의 대분류마다 소분류 콤보박스가 적용되는 것을 확인할 수 있습니다.

Comments