【问题标题】:Synchronizing multiple datagridviews with same source list使用相同的源列表同步多个数据网格视图
【发布时间】:2021-11-02 02:14:51
【问题描述】:

我目前正在构建一个应用程序,在该应用程序上我有 5 个 DataGridViews,它们都显示来自 BindingList 的相同信息。

DataGridView 1 是一个管理网格,我可以在其中修改列表中的数据。 DataGridView 2 到 5 本质上是只读网格,我不需要修改任何数据,但在每个 DataGridView 中,我需要能够选择不同的行,以显示一些状态信息。

我尝试将所有 DataGridViews 链接到同一个 BindingList,但是我遇到的问题是,当我在 DGV1 中选择一行时,它也会在其他 DGV 上突出显示它,这是我不想要的。

然后我将每个单独的 DGV 链接到一个单独的新 BindingList,并将原始列表作为内容。

grdAdmin.DataSource = new BindingList<myClass>(selectedList);
grd1.DataSource = new BindingList<myClass>(selectedList);
grd2.DataSource = new BindingList<myClass>(selectedList);
grd3.DataSource = new BindingList<myClass>(selectedList);
grd4.DataSource = new BindingList<myClass>(selectedList);

这解决了能够在每个 DGV 上选择不同行的问题,但是当我在 Administration-DGV 中修改列表时,更新不会自动推送到其他 DGV,这是合乎逻辑的,因为它们是单独的实例。 为了解决这个问题,我可以将原始列表重新链接到所有单个实例,但随后它会丢失 DGV 中的选择,因此不再向我显示正确的状态。

我可以通过首先检查 DGV 并记住每个 DGV 中选定的行并在刷新绑定列表时重新选择它来解决这个问题,但这很麻烦。

所以我想知道正确的方法是什么? 在理想情况下,我有一个列表:

  • 正在从管理员 DGV 修改
  • 自动更新所有其他 DGV,无需重新链接
  • 允许我在每个 DGV 中选择单独的行

我期待您的想法。 谢谢

*** 更新 *** 我只是注意到其他 DGV 实际上会更新,除非我刷新它们才显示。所以我将其用作临时解决方案,但我仍然很想知道我是否仍然可以改进它,或者这样做的“正确”方法是什么。

【问题讨论】:

  • “更新不会自动推送到其他 DGV”到底是什么意思?您是指在 selectedList 中添加/删除的项目,还是更改列表中项目的属性值?
  • 我的意思是当我在 Admin-DGV 中更新一个值时,在其他 DGV 中该值不会被更新。直到我发现我需要刷新 DGV。
  • 那么您是否要更改myClass 实例的属性值? myClass 是否实现INotifyPropertyChanged
  • 恐怕没有
  • 如果没有在 myClass 中实现 INotifyPropertyChanged 接口,其他 BindingList 实例不可能引发事件,因此只需在 myClass 中实现该接口即可。

标签: c# datagridview binding


【解决方案1】:

在源和各种 DataGridView 之间放置 5 个不同的 BindingSource。它们保持自己的位置感,并且可以将其他控件绑定到它们,但它们会更新一个通用列表

grdAdmin.DataSource = new BindingSource { DataSource = selectedList };
grd2.DataSource = new BindingSource { DataSource = selectedList };
grd2.ReadOnly = true;
...

将 selectedList 设为 DataTable 也可能更容易,因为它已经实现了所有必要的事件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2011-02-19
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多