每当我这样做时,我通常都会将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 方法来检索底层模型对象的原因只是为了避免为其生成列。