Question

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!

Was it helpful?

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.

OTHER TIPS

Please refer the the below example, showing exactly what you are looking for

http://www.codeproject.com/Articles/20165/CheckBox-Header-Column-For-DataGridView

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top