You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多个绑定同一数据源的DataGridView如何实现独立选行与数据同步更新

解决方案

核心问题是同一数据源绑定到多个DataGridView时,默认共享同一个CurrencyManager(货币管理器)导致选中行同步,无需创建多个独立BindingList实例,按以下标准方案实现即可满足所有需求:


实现步骤

  1. 仅维护一个全局的原始BindingList<myClass>作为唯一数据源,同时确保自定义类myClass实现INotifyPropertyChanged接口,保证对象属性修改时所有绑定控件能自动感知变更:
// 全局唯一数据源,所有编辑操作都直接作用在这个实例上
private BindingList<myClass> _sourceData = new BindingList<myClass>();
  1. 给每个DataGridView单独创建独立的BindingSource实例,全部绑定到同一个原始数据源,再将每个DataGridView的DataSource指向对应的BindingSource即可:
// 管理端可编辑表格配置
BindingSource adminBs = new BindingSource();
adminBs.DataSource = _sourceData;
grdAdmin.DataSource = adminBs;
grdAdmin.ReadOnly = false;

// 只读表格各自绑定独立BindingSource
BindingSource bs1 = new BindingSource { DataSource = _sourceData };
grd1.DataSource = bs1;
grd1.ReadOnly = true;

BindingSource bs2 = new BindingSource { DataSource = _sourceData };
grd2.DataSource = bs2;
grd2.ReadOnly = true;

// grd3、grd4按相同逻辑配置即可

方案效果验证

  • 支持管理端直接修改数据源:所有编辑操作直接作用于全局唯一的_sourceData,符合数据一致性要求
  • 自动同步所有DGV数据:所有BindingSource绑定同一个数据源,只要myClass实现属性变更通知、BindingList本身支持列表结构变更通知,数据修改会自动同步到所有表格,无需手动刷新或重新绑定
  • 各DGV选中行完全独立:每个BindingSource对应独立的CurrencyManager,各个表格的选中状态互不干扰

补充配置说明

如果之前未给myClass实现INotifyPropertyChanged,可参考以下示例修改:

public class myClass : INotifyPropertyChanged
{
    private string _itemName;
    public string ItemName
    {
        get => _itemName;
        set 
        { 
            _itemName = value;
            NotifyPropertyChanged(nameof(ItemName));
        }
    }

    // 其余属性按相同逻辑实现变更通知即可

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

内容的提问来源于stack exchange,提问作者Cainnech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:57:04