简体   繁体   中英

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!

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

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM