C# DataGridView不显示我的列表

C# DataGridView不显示我的列表,c#,winforms,list,datagridview,C#,Winforms,List,Datagridview,虽然这个网站上有很多关于用对象填充gridview的帖子,但我无法让它工作 我有一个名为Logs的类,它有3个公共属性-时间、描述和错误。 还有一个名为logList的公共属性,它将返回日志对象列表 我的WinForm中有DataGridView,名为myGV,有3列,分别为Time、Description和Error 所以我试着: myGV.DataSource = Logs.logList.OrderBy(x => x.Time); 但我的DataGridView没有显示任何内容,即

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

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

我的WinForm中有DataGridView,名为myGV,有3列,分别为Time、Description和Error

所以我试着:

myGV.DataSource = Logs.logList.OrderBy(x => x.Time);
但我的DataGridView没有显示任何内容,即使日志列表中确实包含数据

感谢您在此网站上的工作

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

手动添加列后,必须确保更新其中每个列的
DataPropertyName

  • 单击DataGridView顶部的小箭头以显示控件的任务。
  • 单击编辑列
  • 对于每个列,找到属性
    DataPropertyName
    ,并将其更改为
    Date
    Error
    Description
    以及您为列使用的任何其他名称。
确保这些属性与Logs类中的
属性相匹配


手动添加列后,必须确保更新每个列的
DataPropertyName

  • 单击DataGridView顶部的小箭头以显示控件的任务。
  • 单击编辑列
  • 对于每个列,找到属性
    DataPropertyName
    ,并将其更改为
    Date
    Error
    Description
    以及您为列使用的任何其他名称。
确保这些属性与Logs类中的
属性相匹配


奇怪的是,你说
如果我从myGV中删除所有列,它会显示数据…
。我重现了您的问题,原因是您的
LINQ
查询未执行。在将结果用作
DataGridView
DataSource
之前,必须调用
ToList()
或类似方法:

myGV.DataSource = Logs.logList.OrderBy(x => x.Time).ToList();
当然,如果静态列没有与数据源的属性匹配的
DataPropertyName
,那么将有更多的列添加到
DataGridView
中。例如,假设所有的
时间
描述
错误
都是在设计时添加的,而没有分配任何
DataPropertyName
yourDataGridView.AutoGenerateColumns=true
(默认情况下),如果您如上分配
DataGridView
数据源
,您的
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
为您自动生成列即可

奇怪的是,你说
如果我从myGV中删除所有列,它会显示数据…
。我重现了您的问题,原因是您的
LINQ
查询未执行。在将结果用作
DataGridView
DataSource
之前,必须调用
ToList()
或类似方法:

myGV.DataSource = Logs.logList.OrderBy(x => x.Time).ToList();
当然,如果静态列没有与数据源的属性匹配的
DataPropertyName
,那么将有更多的列添加到
DataGridView
中。例如,假设所有的
时间
描述
错误
都是在设计时添加的,而没有分配任何
DataPropertyName
yourDataGridView.AutoGenerateColumns=true
(默认情况下),如果您如上分配
DataGridView
数据源
,您的
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
为您自动生成列即可

OrderBy()返回不可绑定到DataGridView的IOrderedEnumerable类型的数据。 因此,您必须将它们强制转换到绑定源。 使用ToList()方法,如 “OrderBy().ToList()”来绑定gridview。
dataGridView1.DataSource=studList.OrderBy(a=>a.Age.ToList()

它正在工作

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

OrderBy()返回无法绑定到DataGridView的IORDerenumerable类型的数据。 因此,您必须将它们强制转换到绑定源。 使用ToList()方法,如 “OrderBy().ToList()”来绑定gridview。
dataGridView1.DataSource=studList.OrderBy(a=>a.Age.ToList()

它正在工作


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

您的列是如何“调用”的?另外,您使用的是WinForms还是WPF?列的“名称”属性设置为时间、说明和错误。您的日志列表是什么类型?它是一个列表、数组等吗。。。?(更好的是,你能发布你的日志类吗?)看看这个例子,如果它能帮助你以不同的方式设置绑定:(看看Jared的答案)你的列是如何被称为什么的?还有,你是在使用WinForms还是WPF?列的'Name'属性设置为Time、Description和Error。你的日志列表是什么类型的?它是一个列表、数组等吗。。。?(更好的是,你能发布你的日志类吗?)看看这个例子,如果它能帮助你设置b