【问题标题】:Bind a Dictionary To DataGridView in with frequent updates通过频繁更新将字典绑定到 DataGridView
【发布时间】:2020-03-07 11:04:12
【问题描述】:

我有一个Dictionary (Of long, Class)。该类具有多个属性。我想在 DataGridView 中查看这个 Dictionary 的数据。所以,我只使用了:

DataGridView1.DataSource = Dictionary.Values.ToArray

现在,Dictionary 中记录的 Class 对象中的属性不断更新(太频繁了)。我想直接将这些更新反映到 DataGridView。

我认为每次都使用DataGridView1.DataSource = Dictionary.Values.ToArray 不是一种有效的方式,并且会占用大量处理能力。如何使字典可绑定(例如在 DataTables 中)?我在 VB.NET 中需要这个,我尝试使用 Linq 来解决这个问题(在这里找到 https://stackoverflow.com/a/855954/2546348)但是,我没有看到 DataGridView 的新更新。

有什么建议吗?实现这一点的最佳方法是什么?

【问题讨论】:

  • 你在用什么,WPF 还是 WinForms?
  • 抱歉没有在帖子中提到,WinForms。
  • 你的类对象应该实现INotifyPropertyChanged。完成后,您可以将 [Dictionary].Values 绑定到 BindingSource,然后将 DGV 绑定到 BindingSource(设置 DGV 的 .DataSource = [TheBindingSource])。对 Dictionary 值的任何更改都会立即反映在 DGV 中。
  • 谢谢,@Jimi 您的解决方案非常有效。我又想到了一个问题。现在如何做同样的事情,但是当一个新项目添加到字典中或从中删除时?是否可以发出任何类似的通知,让数据源根据最新项目(字典上的添加和删除)更新,而无需再次为 DGV 分配数据源...感谢您的帮助。
  • 不是直接的。即使[Dictionary].Values 公开的 ValueCollection 不是静态的(当您在字典中添加/删除时,底层的 ValueCollection 引用将更新),它不会引发列表更改通知(实际上是有方法的,但我赢了不建议任何:)。您可以: 1) 将新项目添加到 BindingSource(TValue 对象,BindingSource.Add([object])),在需要时同步字典。 2) 创建自己的类,继承自 Dictionary 并实现IBindingList 接口。 3) 使用 DataTable 而不是 Dictionary

标签: vb.net winforms dictionary datagridview


【解决方案1】:

感谢@jimi 的评论,我使用了 notify 属性来实现这一点......但我需要回答这个问题:

你的类对象应该实现INotifyPropertyChanged。完成后,您可以将 [Dictionary].Values 绑定到 BindingSource,然后将 DGV 绑定到 BindingSource(设置 DGV 的 .DataSource = [TheBindingSource])。对 Dictionary 值的任何更改都会立即反映在 DGV 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多