每当我这样做时,我通常会grid.DataSource
在对象上生成 LINQ 投影的结果。
所以是这样的:
grid.DataSource = objects.Select(o => new
{ Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();
好消息是您可以设置AutoGenerateColumns
为 true,这将根据投影对象的属性生成列。
编辑:
这种方法的一个缺点是,通过将所有内容投影到匿名对象中,例如,在需要在单击事件中访问特定对象的情况下,您可能会遇到问题。
在这种情况下,您最好定义一个显式视图模型并将您的对象投影到其中。例如,
class MyViewModel
{
public int Column1 { get;set; }
public int Column2 { get;set; }
}
grid.DataSource = objects.Select(o => new MyViewModel()
{ Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();
编辑2:
MyViewModel
表示要在 中显示的所有列DataGridView
。示例属性当然应该重命名以适合您正在做的事情。通常, ViewModel 的目的是充当一种转换器,在模型(在您的情况下是您的对象列表)和视图之间进行调解。
如果您想保留对底层对象的引用,最好的方法可能是通过构造函数提供它:
class MyViewModel
{
public int Column1 { get;set; }
public int Column2 { get;set; }
....
private SomeType _obj;
public MyViewModel(SomeType obj)
{
_obj = obj;
}
public SomeType GetModel()
{
return _obj;
}
}
grid.DataSource = objects.Select(o => new MyViewModel(o)
{ Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();
我使用 getter 方法来检索底层模型对象的原因只是为了避免为它生成列。