【发布时间】: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