c# - 如何使用自定义对象仅显示 DataGridView 中的某些列

标签 c# datagridview

我有一个 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/

相关文章:

c# - 将具有未知大小数组的结构从非托管代码传递到托管代码

c# - 如果之前未选择任何行,则阻止 DataGridView 在排序时选择行

c# - DataGridView DataBindingComplete 事件的替代方案

c# - 在 C# 中创建数据库文件夹 (SQL Management Studio)

c# - 无法通过 Magento API 更新库存可用性/库存值(value)

c# - WCF未处理的用户代码异常

c# - 为什么异步方法需要等待

c# - 如何在不删除排序工具的情况下删除 datagridview 中的排序字形

c# - datagridview 中行分隔符的颜色

c# - 验证失败,但无法在 DataGridView 中移除