虽然这个网站上有很多关于用对象填充 gridview 的帖子,但我无法让它工作。
我有一个名为 Logs 的类,它具有 3 个公共(public)属性 - Time、Description 和 Error。 还有一个名为 logList 的公共(public)属性,它将返回一个日志对象列表。
我的 WinForm 中有 DataGridView,称为 myGV,有 3 列,分别称为时间、描述和错误。
所以我正在尝试:
myGV.DataSource = Logs.logList.OrderBy(x => x.Time);
但我的 DataGridView 什么也不显示,即使 logList 确实包含数据。
感谢您在此网站上所做的工作!
更新: 如果我从 myGV 中删除所有列,它会显示数据。那么如何将静态列与我的对象列表中的属性相匹配呢?
最佳答案
你说的很奇怪如果我从 myGV 中删除所有列,它会显示数据...
。我重现了您的问题,原因是您的 LINQ
查询未执行。在将结果用作 DataGridView
的 DataSource
之前,您必须调用 ToList()
或类似方法:
myGV.DataSource = Logs.logList.OrderBy(x => x.Time).ToList();
当然,如果您的静态列没有与 DataSource 的属性相匹配的 DataPropertyName
,添加到您的 DataGridView
的列将比您预期的多。例如,假设所有 Time
、Description
和 Error
都是在设计时添加的,而没有分配任何 DataPropertyName
和 yourDataGridView.AutoGenerateColumns = true
(默认情况下),如果您如上所述分配 DataGridView
的 DataSource
,您的 DataGridView
可能有 6 列,而不是 3 列。因此,您可以在为 DataGridView
分配 DataSource
之前分配添加的列的 DataPropertyName
,像这样:
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
自动为您生成列。
关于c# - DataGridView 不显示我的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18213154/