【问题标题】:A good collection to use when binding to a DataGridView in C#在 C# 中绑定到 DataGridView 时使用的一个很好的集合
【发布时间】:2010-12-15 22:25:17
【问题描述】:

在 C# 中将数据列表绑定到 DataGridview 时,最好使用什么集合?我目前只使用一个通用列表,但是当从列表中添加或删除对象时,数据网格不会更新。我已经研究过使用 BindingList 或 ObservableCollection,但无法确定哪个最适合使用它来更新并易于排序/过滤,而无需重新绑定到数据网格。我目前在 .Net 3.5 框架上以 Windows 形式工作,并计划很快转移到 WPF。

【问题讨论】:

  • 我现在也在使用 Linq 对通用对象列表进行排序和过滤。我也可以使用 BindingList 执行此操作,但这样做会迫使我将列表重新绑定到数据网格。

标签: c# wpf winforms data-binding collections


【解决方案1】:
  • ObservableCollection<T> 不适用于 DataGridView :它实现了 INotifyCollectionChanged,而不是 IBindingList,并且 DataGridView 不知道 INotifyCollectionChanged。它用于 WPF 绑定,不用于 Windows 窗体
  • BindingList<T> 是一个不错的选择,但请注意,它不支持开箱即用的排序或过滤。不过,您可以在网络上找到这些功能的一些自定义实现。
  • 如果您需要排序和/或过滤功能,DataTable 可能是您的最佳选择

【讨论】:

  • 我可以将 DataTable 与一组对象一起使用吗?
  • 你是什么意思?你能说得更具体些吗?
  • 我有一个带有业务对象层的 3 层应用程序,我需要收集一种类型的业务对象。这可能与DataTable有关吗?我认为 DataTable 只能与数据库中的数据海峡一起使用。
  • 它可以用于任何数据,而不仅仅是来自数据库的数据(尽管它是它的主要目标)。但是列只能包含原始类型,因此您必须将业务对象的属性复制到数据表中
【解决方案2】:

WinForms 和 WPF 之间的数据绑定框架是完全不同的,因此(一般来说)它们都没有“最佳选择”。

对于 WinForms,使用通用 BindingList<T> 将完成您想要的大部分工作(尽管它不处理对单个项目的更改;您必须自己实现)。

对于 WPF,ObservableCollection<T> 的用途类似。

【讨论】:

  • BindingList 有什么原因不能在 WPF 中工作吗?
  • BindingList<T> 使用 IBindingList 接口,这是 WinForms 用于其列表数据绑定的接口。 WPF 使用INotifyCollectionChanged
【解决方案3】:

实际上,Microsoft 建议使用 Collection 作为绑定集合而不是 List,因为它能够执行自动功能,例如添加和删除项目、清除集合或设置现有项目的值。

Collection Class 在 MSDN 上。

【讨论】:

    【解决方案4】:

    如果您想将集合绑定到数据网格视图,我会使用绑定列表。虽然 bindinglist 不支持开箱即用的排序,但您可以通过创建自己的从 BindinList 派生的列表来扩展它并实现自己的排序。

    请参阅here 了解如何执行此操作。

    【讨论】:

      【解决方案5】:

      也许是一个数据表?

      此外,您通常可以通过在添加项目后立即调用 DataGridview.Invalidate() 来强制网格视图重新绘制并包含新项目。

      【讨论】:

        【解决方案6】:

        我认为对于哪种类型的集合最适合 DataGridView,没有硬性/一般规则。

        这实际上取决于几个因素:
        - 数据的性质
        - 从 UI 到 DB 执行哪些操作(如果有)(例如 CRUD、排序、过滤)
        - 数据大小
        等等等等。

        【讨论】:

          【解决方案7】:

          我创建了我自己的集合,它继承自 BindingList,它支持排序、过滤等。它现在运行良好,但工作量很大,我真的不建议自己做一个……我认为 CodeProject 上已经实现了一个或类似的网站,如果我找到它,我会给你链接。

          编辑:

          我发现this CodeProject article 有一个支持排序、过滤等的IBindingList 实现。虽然我没有测试它,所以我不知道它的实现有多好,但它可能值得一试。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-08-10
            • 1970-01-01
            • 2017-03-22
            • 2012-02-17
            • 2012-01-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多