1

虽然这个网站上有很多关于用对象填充网格视图的帖子,但我无法让它工作。

我有一个名为 Logs 的类,它有 3 个公共属性——时间、描述和错误。还有一个名为 logList 的公共属性将返回日志对象列表。

我的 WinForm 中有 DataGridView,称为 myGV,有 3 列,分别称为时间、描述和错误。

所以我正在尝试:

myGV.DataSource = Logs.logList.OrderBy(x => x.Time);

但我的 DataGridView 什么也不显示,即使 logList 确实包含数据。

感谢您在本网站上的工作!

更新:如果我从 myGV 中删除所有列,它会显示数据。那么如何将静态列与我的对象列表中的属性匹配呢?

4

3 回答 3

3

手动添加列后,您必须确保更新DataPropertyName每一列:

  • 单击 DataGridView 顶部的小箭头,以显示控件的任务。 在此处输入图像描述
  • 单击编辑列
  • 对于您的每个列,找到属性DataPropertyName并将它们更改为DateError以及Description您用于列的任何其他名称。 在此处输入图像描述

确保这些与您Properties在 Logs 类中的匹配。

在此处输入图像描述

于 2013-08-13T15:58:58.380 回答
3

你说的很奇怪If I remove all columns from myGV it does display data...。我重现了您的问题,原因是您的LINQ查询未执行。ToList()在使用以下结果之前,您必须调用或DataSource类似方法DataGridView

myGV.DataSource = Logs.logList.OrderBy(x => x.Time).ToList();

当然,如果您的静态列DataPropertyName与 DataSource 的属性不匹配,那么添加到您的列DataGridView将比您预期的要多。例如,假设在设计时添加了所有Time,Description并且没有分配任何and (默认情况下),如果您如上所述分配您的 ,您可能有 6 列,而不是 3 列。所以您可以分配您的在为您分配 之前添加了列,如下所示:ErrorDataPropertyNameyourDataGridView.AutoGenerateColumns = trueDataSourceDataGridViewDataGridViewDataPropertyNameDataSourceDataGridView

myGV.Columns["Time"].DataPropertyName = "Time";
myGV.Columns["Description"].DataPropertyName = "Description";
myGV.Columns["Error"].DataPropertyName = "Error";
myGV.DataSource = Logs.logList.OrderBy(x => x.Time).ToList();//This should be called at here after all the DataPropertyNames are initialized.

我建议您设置myGV.AutoGenerateColumns = true(默认情况下)并删除所有添加的列,让DataGridView自动为您生成列。

于 2013-08-13T18:13:43.273 回答
0

OrderBy() 返回 IOrderedEnumerable<> 类型的数据,不能绑定到 DataGridView。因此,您必须将它们强制转换为绑定源。使用“OrderBy().ToList()”之类的 ToList() 方法来绑定您的网格视图。 dataGridView1.DataSource = studList.OrderBy(a => a.Age).ToList();

这是工作 截屏

有关绑定 DataGridView 的更多信息,请访问dataGridView 绑定

于 2013-08-14T02:31:00.670 回答