使用对象列表和复选框列创建一个简单的 DataGridView (C#)
-
11-12-2019 - |
题
我看过很多地方,但我正在努力做这个看似简单的事情。我有一个 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
覆盖 Paint
和 OnMouseClick
方法。
其他提示