我有一个 DataGridView,我需要向它添加自定义对象。考虑以下代码:
DataGridView grid = new DataGridView();
grid.DataSource = objects;
通过这段代码,我得到了一个 DataGridView 对象,其中所有属性都作为列。就我而言,我不想显示所有这些信息;我只想显示两列或三列。我知道我可以设置
AutoGenerateColumns = false
。
但我不知道之后如何进行。 一种选择是隐藏所有我不感兴趣的列,但我认为以相反的方式进行会更好。我该怎么做?
最佳答案
每当我这样做时,我通常都会将 grid.DataSource
作为对象上 LINQ 投影的结果。
所以像这样:
grid.DataSource = objects.Select(o => new
{ Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();
好的是,您随后可以将 AutoGenerateColumns
设置为 true,这将根据投影对象的属性生成列。
编辑:
这种方法的一个缺点是,通过将所有内容转换到匿名对象中,您可能会遇到问题,例如,您需要在点击事件中访问特定对象。
在这种情况下,您最好定义一个显式 View 模型并将您的对象投影到其中。例如,
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 的目的是充当一种转换器,在模型(在您的情况下是您的对象列表)和 View 之间进行调解。
如果您想保留对底层对象的引用,最好的方法可能是通过构造函数提供它:
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 方法来检索底层模型对象的原因只是为了避免为其生成列。
关于c# - 如何使用自定义对象仅显示 DataGridView 中的某些列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14793990/