Search code examples
c#winformsdatagridviewdatagridviewcolumndatagridviewcheckboxcell

Create a simple DataGridView with List of objects and checkbox column (C#)


I have looked at a lot of places and I'm struggling to do this supposedly simple thing. I have a Windows form on which I've to show a simple DataGridView in this form:

| (CheckBoxColumn) | FilePath | FileState |

Now, there are a couple of problems. The data I need to bind to them is in a List of objects like this:

    class FileObject
    {
        string filePath;
        string fileState;
    }

    //Now here's the list of these objects which I populate somehow. 
    List<FileObject> listFiles;
  • Is there any efficient way to bind this directly to the DataGridView so that different members of Object in the list are bound to different columns, and for each there's checkbox?
  • I saw the examples of adding checkbox column to a datagrid, but none of them showed how to add it to the 'header' row as well, so that it can behave as a 'check all'/'uncheck all' box.

Any help in how to achieve this would be great! I do write simple applications in C# but never had to work with datagrids etc. :(

Thanks!


Solution

  • The DataGridView control has a feature to automatically generate columns that can be set by the AutoGenerateColumns property. This property defaults to true - that is columns are by default auto generated.

    However, columns are only automatically generated for public properties of the object you bind to the grid - fields do not show up.

    Auto generation also works for check box columns when there is a public boolean property on the bound object.

    So the simplest way to achieve your first two requirements is to change your FileObject class to this:

    public class FileObject
    {
        public string FilePath { get; set; }
        public string FileState { get; set; }
        public bool Selected { get; set; }
    }
    

    If you cannot modify that class then next best would be the create a wrapper object that holds a file object:

    public class FileObjectWrapper
    {
        private FileObject fileObject_;
    
        FileObjectWrapper()
        {
            fileObject_ = new FileObject();
        }
    
        FileObjectWrapper(FileObject fo)
        {
            fileObject_ = fo;
        }
    
        public string FilePath
        {
            get { return fileObject_.filePath; }
            set { fileObject_.filePath = value; }
        }
    
        public string FileState
        {
            get { return fileObject_.fileState; }
            set { fileObject_.fileState= value; }
        }
    
        public bool Selected { get; set; }
    }
    

    You can then create your list to bind to (a BindingList is usually best) doing something like:

    var fowList = new BindingList<FileObjectWrapper>();
    
    foreach (FileObject fo in // here you have your list of file objects! )
    {
        fowList.Add(new FileObjectWrapper(fo));
    }
    
    dataGridView1.DataSource = fowList;    
    

    There are many ways to do the above but that is a general idea.


    You can also add an unbound DataGridViewCheckBoxColumn to the grid, though I find it easier to have in the the bound list. Here is how if you do need to:

    DataGridViewCheckBoxColumn c = new DataGridViewCheckBoxColumn();
    c.Name = "Selected";
    dataGridView1.Columns.Add(c);
    

    Finally, for having a "SelectedAll" option in the header you will need to use custom code.

    The article on CodeProject that Umesh linked to (CheckBox Header Column for DataGridView) looks quite easy to implement - they create a custom DataGridViewHeaderCell overriding the Paint and OnMouseClick methods.