【问题标题】:One-Way data binding of a DataGridView to list of objectsDataGridView 到对象列表的单向数据绑定
【发布时间】:2025-12-23 20:45:11
【问题描述】:

我知道有很多类似的问题,我花了很多时间寻找可能的解决方案。但我仍然不确定最简单的方法是什么。

目标是在DataGridView 中显示LogItems(时间戳、严重级别、消息),并按时间戳排序,并允许用户按严重级别过滤项目。

这正是我(不需要)需要的:

  • DataGridView 到对象列表/集合的单向数据绑定。用户无需通过DataGridView 编辑对象或通过DataGridView 添加/删除对象。但是当我向底层列表/集合添加或删除对象时,DataGridView 应该会自动更新。
  • 对象有一个时间戳 (DateTime),应该按这个时间戳排序。我不在乎列表本身是否使它们保持排序(类似SortedList<T> 会很好,但它不存在)或者DataGridViewBindingSource 是否负责排序。用户无需通过单击列标题来设置排序。
  • 基于单列值的简单过滤(严重性)。

以下是我想出的一些方法:

  • 使用BindingList<T>,因为它不支持排序和过滤,因此底层集合不起作用。
  • 如果基础集合不支持排序和过滤,则使用 BindingSource 包装某些集合没有帮助。
  • 编写实现IBindingListView 的自定义集合。这看起来很复杂,我只需要IBindingListView 提供的功能的一个子集。而且我太懒了。
  • 使用BindingListViewsourceforge project。这对于我需要的东西来说可能太重了,如果我不需要的话,我不想依赖第三方库。

对此有什么简单快速的解决方案?

【问题讨论】:

    标签: c# sorting data-binding datagridview filtering


    【解决方案1】:

    我建议使用 DataTable。你会得到你需要的一切。

    只需将 DataGridView 设为只读以防止用户编辑。当底层 DataTable 更新时,它仍然会更新。

    干杯

    【讨论】:

      【解决方案2】:

      使用DataTable 是一种选择,但最后我决定改用sourceforge 中的BindingListView,我对此非常满意。

      DataTable 方法的问题在于,它需要将所有数据从我的自定义对象复制到 DataTable 中,仅用于显示。

      【讨论】: