Click here to Skip to main content
Licence CPOL
First Posted 3 Jan 2008
Views 93,531
Bookmarked 50 times

Column Header CheckBox in DataGridView (Winfoms)

By | 4 Jan 2008 | Article
How to display Column Header CheckBox in Winfoms DataGridView

Introduction

This article will explains about creating & displaying Column Header CheckBox in winforms DataGridView.

Background

Bydefault DataGridView doen't supports column header chekbox, for this we need to write a class which is inherited by DataGridViewColumnHeaderCell class.

1) Add a boolean propery named CheckAll in that class to maintain the seleced state of Header checkbox.

2) override default implemention of Paint method. In this method, drawing the CheckBox at column Header.

3) override its OnMouseClick event. Here handle the click event of header checkbox.

I have created class named DGVColumnHeader as follows...

    class DGVColumnHeader : DataGridViewColumnHeaderCell
    {
        private Rectangle CheckBoxRegion;
        private bool checkAll = false;

        protected override void Paint(Graphics graphics,
            Rectangle clipBounds, Rectangle cellBounds, int rowIndex,
            DataGridViewElementStates dataGridViewElementState,
            object value, object formattedValue, string errorText,
            DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle,
            DataGridViewPaintParts paintParts)
        {

            base.Paint(graphics, clipBounds, cellBounds, rowIndex, dataGridViewElementState, value,
                formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);

            graphics.FillRectangle(new SolidBrush(cellStyle.BackColor), cellBounds);

            CheckBoxRegion = new Rectangle(
                cellBounds.Location.X + 1,
                cellBounds.Location.Y + 2,
                25, cellBounds.Size.Height - 4);


            if (this.checkAll)
                ControlPaint.DrawCheckBox(graphics, CheckBoxRegion, ButtonState.Checked);
            else
                ControlPaint.DrawCheckBox(graphics, CheckBoxRegion, ButtonState.Normal);

            Rectangle normalRegion =
                new Rectangle(
                cellBounds.Location.X + 1 + 25,
                cellBounds.Location.Y,
                cellBounds.Size.Width - 26,
                cellBounds.Size.Height);

            graphics.DrawString(value.ToString(), cellStyle.Font, new SolidBrush(cellStyle.ForeColor), normalRegion);
        }

        protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
        {
            //Convert the CheckBoxRegion 
            Rectangle rec = new Rectangle(new Point(0, 0), this.CheckBoxRegion.Size);
            this.checkAll = !this.checkAll;
            if (rec.Contains(e.Location))
            {
                this.DataGridView.Invalidate();
            }
            base.OnMouseClick(e);
        }

        public bool CheckAll
        {
            get { return this.checkAll; }
            set { this.checkAll = value; }
        }
    }
    
First Initialize a object of DGVColumnHeader add to DataGridView columns using Insert method at desired place. In this example i have added at first column and assigned to HeaderCell of it.

        //Create the object of DGVColumnHeader 
        DGVColumnHeader dgvColumnHeader;
        private void Form1_Load(object sender, EventArgs e)
        {
            //initialize DGVColumnHeader object
            dgvColumnHeader = new DGVColumnHeader();
            
            //Add columns dynamically  to gridview
            dataGridView1.Columns.Insert(0, new DataGridViewCheckBoxColumn());
            dataGridView1.Columns[0].HeaderCell = dgvColumnHeader;
            
            //Data Binding 
            DataTable dt = new DataTable();
            dt.Columns.Add("1");
            dt.Columns.Add("2");
            dt.Rows.Add("100", "101");
            dt.Rows.Add("102", "103");
            dataGridView1.DataSource = dt;
        }
        
Add the following code in dataGridView1_ColumnHeaderMouseClick event to check/uncheck all the records based on the header checkbox state

        private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                for (int i = 0; i < dataGridView1.Rows.Count; i++)
                {
                    dataGridView1.Rows[i].Cells[0].Value = dgvColumnHeader.CheckAll;
                }
            }
        }
      
When we select any of checkbox cell other than Header checkbox, by default grid will shows as edit mode. This we can handle using dataGridView1_CellClick event

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                for (int i = 0; i < this.dataGridView1.RowCount; i++)
                {
                    //Escalate Editmode
                    this.dataGridView1.EndEdit();
                    string re_value = this.dataGridView1.Rows[i].Cells[0].EditedFormattedValue.ToString();
                    this.dataGridView1.Rows[i].Cells[0].Value = "true";
                }
            }
        }

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Ramana.Gali

Technical Lead

Singapore Singapore

Member

C# Developer have Hands on Web Developement using ASP.NET, Web Services, Win Serivces, Pocket PC, Smart Device,Enterprize Security Applications and Win Forms Development using .NET FW 1.1 & 2.0.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralDataGridViewCheckbox column delete issue in Windows C# PinmemberPalswipro3:38 17 Dec '09  
GeneralRe: DataGridViewCheckbox column delete issue in Windows C# Pinmemberawadhendra tiwari2:46 22 Aug '11  
GeneralThank you PinmemberKaranig22:37 27 Sep '09  
GeneralSolution to uncheck the checkbox in the header when uncheck the checkbox in the rows. PinmemberViji Raj17:56 30 Jun '09  
GeneralRe: Solution to uncheck the checkbox in the header when uncheck the checkbox in the rows. Pinmemberkrillgar3:40 7 Mar '12  
GeneralThanks Pinmembermananthan7520:09 24 Mar '09  
GeneralHow to uncheck the checkbox in the header. PinmemberMember 149020919:05 28 Jun '09  
Generalselect single checkBox Pinmemberkanza azhar9:05 6 Aug '08  
GeneralRe: select single checkBox Pinmemberjackyonly200320:48 14 Jan '10  
QuestionHelp me. Checkbox in DataGridView Pinmemberthangnvhl21:21 13 May '08  
Generalhelp can you add also the original source Pinmembersognant11:11 27 Jan '08  
GeneralA little light in the "explain" department... PinmvpDave Kreskowiak10:36 4 Jan '08  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120517.1 | Last Updated 4 Jan 2008
Article Copyright 2008 by Ramana.Gali
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid