我看过很多地方,但我正在努力做这个看似简单的事情。我有一个 Windows 窗体,必须在其中显示一个简单的 DataGridView,如下所示:

| (CheckboxColumn)| filepath | filestate |

现在,有几个问题。我需要绑定到它们的数据位于如下对象列表中:

    class FileObject
    {
        string filePath;
        string fileState;
    }

    //Now here's the list of these objects which I populate somehow. 
    List<FileObject> listFiles;
  • 是否有任何有效的方法可以将其直接绑定到DataGridView,以便列表中的对象的不同成员绑定到不同的列,并且对于每个复选框?
  • 我看到了将复选框列出到数据杂志的示例,但是它们都没有显示如何将其添加到“标头”行中,以便它可以作为“检查全部”/“ Uneblect”所有框而表现。

任何关于如何实现这一目标的帮助都会很棒!我确实用 C# 编写了简单的应用程序,但从未使用过数据网格等。:(

谢谢!

有帮助吗?

解决方案

DataGridView 控件具有自动生成列的功能,可以通过 AutoGenerateColumns 属性进行设置。此属性默认为 true - 即默认情况下自动生成列。

但是,只会为您绑定到网格的对象的公共属性自动生成列 - 字段不会显示。

当绑定对象上存在公共布尔属性时,自动生成也适用于复选框列。

因此,实现前两个要求的最简单方法就是改变你的 FileObject 类:

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

如果您无法修改该类,那么接下来最好的方法是创建一个包含文件对象的包装对象:

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; }
}

然后,您可以创建要绑定的列表(BindingList 通常是最好的),执行以下操作:

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;    

有很多方法可以实现上述目的,但这只是一般想法。


您还可以添加未绑定的 DataGridViewCheckBoxColumn 到网格,尽管我发现将其添加到绑定列表中更容易。如果您确实需要,请执行以下操作:

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

最后,为了在标题中包含“SelectedAll”选项,您将需要使用自定义代码。

Umesh 链接到的 CodeProject 上的文章 (DataGridView 的复选框标题列)看起来很容易实现 - 他们创建了一个自定义 DataGridViewHeaderCell 覆盖 PaintOnMouseClick 方法。

其他提示

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top