C# 윈폼 DataGridView에서 CheckBox를 사용해서 RadioButton을 구현 하는 방법

C# .NET으로 윈폼을 개발할 때 정말 많이 사용하는 컨트롤이 DataGridView 입니다. 목록을 나열하는 프로그램에서는 DataGridView가 거의 빠지지 않고 사용된다고 해도 될 정도로 많이 사용되고 있습니다.

이번 글에서는 C# 윈폼 DataGridView에서 CheckBox를 사용해서 RadioButton을 구현 하는 방법에 대해 알아보려고 합니다.

DataGridView의 Column Type에는 여러가지를 지정해서 사용할 수 있지만 아쉽게도 RadioButton 컬럼 타입은 없습니다.
따라서 유사한 기능을 가진 CheckBox 칼럼 타입을 사용해서 RadioButton을 구현할 예정입니다.

CheckBox와 RadioButton의 차이점은 다중 선택을 할 수 있는냐?, 하나만 선택할 수 있는냐?의 차이입니다.

  • CheckBox는 여러 목록 중에서 다중 선택이 가능합니다. (예를 들면 좋아하는 과일을 모두 선택하세요.)
  • RadioButton은 그룹으로 묶인 목록에서 하나만 선택이 가능합니다. (예를 들면 좋아하는 과일 하나만 선택하세요.)

DataGridView의 Column Type 종류

아래 캡쳐 화면에서 보는 것과 같이 DataGridView의  ColumnType (DataGridViewColumn 형식)의 종류에는 총 6가지가 있습니다. 

  • 가장 일반적인 문자나 숫자를 사용하기 위한 DataGridViewTextBoxColumn,
  • 버튼을 표시하기 위한 DataGridViewButtonColumn,
  • 체크박스를 나타내기 위한 DataGridViewCheckBoxColumn,
  • 콤보박스(DropDownList)를 표시하기 위한 DataGridViewComboBoxColumn,
  • 이미지를 보여주기 위한 DataGridViewImageColumn,
  • 링크를 나타내기 위한 DataGridViewLinkColumn
DataGridView의 Column Type 종류

C# DataGridView에서 CheckBox를 사용하여 RadioButton 구현하기

아래 화면은 DataGridView의 체크 박스를 이용해서 라디오 버튼을 구현한 화면의 일부를 캡처한 화면입니다.

“예”의 체크 박스를 체크하면 “아니오”의 체크 박스는 자동으로 체크 해제 됩니다. 반대로 “아니오”를 체크하게 되면 “예”의 체크 박스는 해제 됩니다. 아래에 설명하는 예제는 “예” 또는 “아니오” 둘 중 하나만 선택되도록 구현한 예제 입니다.

C# 윈폼 DataGridView에서 CheckBox를 사용해서 RadioButton을 구현 하는 방법


※ 닷넷 프로그램 뿐만 아니라 모든 프로그램에서도 마찬가지이지만 하나의 결과를 도출하기 위한 프로그래밍 과정은 다양하게 존재할 수 있습니다. 아래에 설명하는 내용 또한 DataGridView에서 RadioButton을 구현하는 수많은 방법 중에 하나임을 미리 알려드립니다.

C# 윈폼의 “CellContentClick” 이벤트에서 RadioButton을 구현하기

1. 셀 내부에 있는 내용을 클릭할 때 발생하는 이벤트인 “CellContentClick” 이벤트에서 RadioButton을 구현해 보겠습니다.

C# 윈폼의 "CellContentClick" 이벤트에서 RadioButton을 구현하기
private void dgvCheckList_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex >= 0 && (e.ColumnIndex == 2 || e.ColumnIndex == 3))
        this.dgvCheckList.CommitEdit(DataGridViewDataErrorContexts.Commit);
 
    if ((bool)this.dgvCheckList.CurrentCell.Value == true && e.ColumnIndex == 2)
        this.dgvCheckList.Rows[e.RowIndex].Cells[3].Value = false;
 
    if ((bool)this.dgvCheckList.CurrentCell.Value == true && e.ColumnIndex == 3)
        this.dgvCheckList.Rows[e.RowIndex].Cells[2].Value = false;
}
 

dgvCheckList“라는 이름의 DataGridView의 ““의 칼럼 위치는 3번째이고, “아니오“의 컬럼 위치는 4번째 입니다.
※ 참고로 DataGridView의 Row와 Column의 Index는 0부터 시작합니다. 첫번째 행과 열은 인덱스 번호는 각각 0 입니다.

if (e.RowIndex >= 0 && (e.ColumnIndex == 2 || e.ColumnIndex == 3))

  • 클릭한 셀 위치가 3번째 또는 4번째 컬럼이면서 1번째 행 이상인 경우를 체크합니다.


this.dgvCheckList.CommitEdit(DataGridViewDataErrorContexts.Commit);

  • DataGridView의 Cell을 편집할 때 해당 Cell를 빠져나오기 전까지는 편집한 내용이 DataGridView의 셀 값으로 반영되지 않은 상태입니다. 다시 말해 입력하는 셀을 벗어나야 셀 값이 DataGridView에 반영됩니다.
  • CommitEdit()“는 편집 모드를 끝내지 않고 현재 셀의 변경 내용을 데이터 캐시에 커밋하는 역할을 수행하게 됩니다.


if ((bool)this.dgvCheckList.CurrentCell.Value == true && e.ColumnIndex == 2)
    this.dgvCheckList.Rows[e.RowIndex].Cells[3].Value = false;

  • 3번째 칼럼이면서 선택한 셀의 값이 “true”인 경우를 체크합니다.
  • 현재 행의 4번째 칼럼의 셀 값으로 “false”를 지정합니다.


▶ 마지막 if문의 경우도 바로 앞의 if문과 같은 의미로 4번째 열의 값에 따라 3번째의 열을 값을 변경하는 로직입니다

프로젝트 소스 첨부

첨부한 프로젝트를 다운 받아 소스를 확인해 보시면 쉽게 이해하실 수 있습니다.



이 글이 도움이 되었기를 바랍니다. ^-^
댓글로 흔적을 남겨 주세요.

This Post Has 4 Comments

  1. 익명

    안녕하세요 좋은 정보 감사합니다.
    질문있어서 답글 남김니다.
    첫번쨰 행에서 하나만 체크가 가능하고
    다음 행에서 선택을 하니 이전 행의 체크한 것도 사라지던데
    이부분은 어떻게 해결하셨나요?

  2. PJH

    안녕하세요 글 잘읽었습니다. 감사합니다.
    질문이 있는데
    체크한 행 다음 행에서 체크를 하면 이전 행에서 체크한 것도 체크가 해제 됩니다.
    이 경우에는 어떻게 해결하셨나요? 저는 선택지가 다섯 개 입니다.

    1. 느티나무 지식창고

      마지막에 첨부한 프로젝트 파일을 다운 받아 참고해 보세요.
      첨부한 프로젝트에는 4개의 체크 박스를 구현한 예제입니다.

답글 남기기