Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

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

0.00/5 (No votes)
7 Feb 2018 1  
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!

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here