多个绑定同一数据源的DataGridView如何实现独立选行与数据同步更新
解决方案
核心问题是同一数据源绑定到多个DataGridView时,默认共享同一个CurrencyManager(货币管理器)导致选中行同步,无需创建多个独立BindingList实例,按以下标准方案实现即可满足所有需求:
实现步骤
- 仅维护一个全局的原始
BindingList<myClass>作为唯一数据源,同时确保自定义类myClass实现INotifyPropertyChanged接口,保证对象属性修改时所有绑定控件能自动感知变更:
// 全局唯一数据源,所有编辑操作都直接作用在这个实例上 private BindingList<myClass> _sourceData = new BindingList<myClass>();
- 给每个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
相关产品推荐
相关产品推荐

