65.9K
CodeProject is changing. Read more.
Home

Adding Checkbox to a List View Column Header in C# WindowsForm Application

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (10 votes)

Mar 7, 2016

CPOL
viewsIcon

43489

downloadIcon

1897

Adding Checkbox to a List View Column Header in C# WindowsForm application

Introduction

Adding checkbox in listview column header, initially Listview doesn't contain checkbox in a column header. We need to create it by using OwnerDraw and some sub items.

Background

You can set OwnerDraw property of ListView to true and draw a ChceckBox on first column header and handle ColumnClick to perform select/deselect all.

Using the Code

  • For drawing the ListView, you need to handle DrawColumnHeader, DrawItem and DrawSubItem events.
  • Draw checkbox in DrawColumnHeader event.
  • Set e.DrawDefault = true; for other drawing events to draw default rendering.
  • Handle ColumnClick event and store the checked state of column header in tag of column. Also, for each item of list view, set Checked property to perform select/deselect all.

The code snippet is as given below:

//
  private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                e.DrawBackground();
                bool value = false;
                try
                {
                    value = Convert.ToBoolean(e.Header.Tag);
                }
                catch (Exception)
                {
                }
                CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(e.Bounds.Left + 4, e.Bounds.Top + 4),
                    value ? System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal :
                    System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);
            }
            else
            {
                e.DrawDefault = true;
            }
        }

        private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
        {
            e.DrawDefault = true;
        }

        private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
        {
            e.DrawDefault = true;
        }

        private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            if (e.Column == 0)
            {
                bool value = false;
                try
                {
                    value = Convert.ToBoolean(this.listView1.Columns[e.Column].Tag);
                }
                catch (Exception)
                {
                }
                this.listView1.Columns[e.Column].Tag = !value;
                foreach (ListViewItem item in this.listView1.Items)
                    item.Checked = !value;

                this.listView1.Invalidate();
//

In the above image, I have 3 columns:

  • I set empty text for first column.
  • I set CheckBoxes property of ListView to true.
  • I set empty text for items and added 2 sub items for each item.

Special thanks to Reza Aghaei for his help!