본문 바로가기

Development/C#

DataGridView헤더에 CheckBox를 달자

요새는 리스트를 사용할때 왼쪽에 다중 선택을 위해 CheckBox를 두는 경우가 많은데, CheckBox를 사용하면서 불편한 점이 하나있다. 목록에서 대상 개수가 많은경우 그걸 전부 클릭할려면 상당히 귀찮은 작업이 된다.

이를 보완하기 위해 보통 버튼을 만들어 전체선택/전체해제등을 만드는 경우가 있다.. 이 또한 화면의 레이아웃을 고려할때 조금은 안 이뻐 보일수 있다..

C#에서 제공하는 DataGridView를 사용하면 컬럼의 종류중에 CheckBoxColumn이 있는데 이건 헤더에는 CheckBox가 보이질 않는다.. 앞에서 말한 디자인 레이아웃을 고려 안한다면 그냥 버튼을 만들어서 해도 무방하다.

여기서는 헤더에 CheckBox를 만들어 넣으므로서 디자인 레이아웃과 전체선택/전체해제를 할 수 있도록 한다.

먼저 C#의 도구상자에서 DataGridView를 하나 선택한다.

첫번째 Column을 CheckBoxColumn형식으로 지정하고, 나머지는 필요한 것으로 사용하면 된다.(꼭 첫번째는 아니어도 상관없다. 다만, 해당 Painting에서 해당 위치를 맞춰줘야 한다.)

 

첫번째 DataGridView의 이벤트창으로 가서 CellPainting을 추가해준다.

CellPainting은 DataGridView의 Cell에 Drawing을 할 수 있도록 하는 이벤트 메소드이다. DataGridViewCellPaintingEventArgs를 파라메터로 받는다.

해당 파라메터를 가지고 작업을 하면 된다.

소스는 다음과 같다.

private void gvSheetList_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.ColumnIndex == 0 && e.RowIndex == -1)
            {
                e.PaintBackground(e.ClipBounds, false);

                Point pt = e.CellBounds.Location;  // where you want the bitmap in the cell

                int nChkBoxWidth = 15;
                int nChkBoxHeight = 15;
                int offsetx = (e.CellBounds.Width - nChkBoxWidth) / 2;
                int offsety = (e.CellBounds.Height - nChkBoxHeight) / 2;

                pt.X += offsetx;
                pt.Y += offsety;

                CheckBox cb = new CheckBox();
                cb.Size = new Size(nChkBoxWidth, nChkBoxHeight);
                cb.Location = pt;
                cb.CheckedChanged += new EventHandler(gvSheetListCheckBox_CheckedChanged);

                ((DataGridView)sender).Controls.Add(cb);

                e.Handled = true;
            }
        }

CheckBox의 전체선택/전체해제 기능을 위해 EventHandler 함수를 만들어서 해당 GridView의 CheckBox의 값을 변경하도록 하면 된다.

        private void gvSheetListCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            foreach (DataGridViewRow r in gvSheetList.Rows)
            {
                r.Cells["colCheck"].Value = ((CheckBox)sender).Checked;
            }
        }

소스는 보면 쉽게 이해갈꺼라 생각이 든다.

결과화면은 다음과 같다.

 

 

 

 

 

'Development > C#' 카테고리의 다른 글

DataGridView의 포멧과 정렬사용하기  (0) 2017.08.22
DataGridView의 헤더를 멀티로 만들어보자  (1) 2012.07.02