DevExpress WinForms中如何绑定GridView到对象列表实现UI自动同步
DevExpress WinForms 绑定对象列表到DataGridView实现UI实时同步
直接按以下步骤配置即可,不需要额外写手动刷新逻辑:
- 第一步:给绑定的实体类实现
INotifyPropertyChanged接口
这一步是保证单个对象的属性值修改时,UI能收到变更通知的基础,示例代码:using System.ComponentModel; using System.Runtime.CompilerServices; public class BizDataModel : INotifyPropertyChanged { private string _code; private decimal _amount; public string Code { get => _code; set { _code = value; OnPropertyChanged(); } } public decimal Amount { get => _amount; set { _amount = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); } } - 第二步:使用支持列表变更通知的集合类型存储数据
不要用普通List<T>做数据源,它不会对外通知增删、元素替换的变更,优先用BindingList<T>,WinForms数据绑定对这个类型的兼容性最好,DevExpress控件原生支持它的所有变更通知:
注意:不推荐用// 全局定义绑定集合 private BindingList<BizDataModel> _dataList = new BindingList<BizDataModel>();ObservableCollection<T>,这个类型是WPF生态优先的,在WinForms下绑定存在部分通知不触发的兼容问题 - 第三步:正确配置控件绑定
推荐加一层BindingSource做中转,后续不管是增删集合元素、修改元素属性,UI都会自动同步,不需要手动调用刷新方法:private void Form_Load(object sender, EventArgs e) { BindingSource dataSource = new BindingSource(); dataSource.DataSource = _dataList; // 原生DataGridView用这行 dataGridView1.DataSource = dataSource; // DevExpress GridControl 替换成下面这行即可 // gridControl1.DataSource = dataSource; } - 常见踩坑说明
- 不要跨UI线程直接修改集合或者对象属性,需要修改时调用控件的
Invoke()方法切到UI线程执行,否则会抛出跨线程访问异常 - 如果必须替换整个数据源集合,不要直接给
_dataList重新new新对象,先调用_dataList.Clear()再逐个添加新元素,或者调用BindingSource.ResetBindings(false)触发全量刷新 - 如果需要用到排序、过滤功能,DevExpress GridControl会基于
BindingList<T>自动实现,不需要额外自定义集合逻辑
- 不要跨UI线程直接修改集合或者对象属性,需要修改时调用控件的
内容的提问来源于stack exchange,提问作者amani abourida
相关产品推荐
相关产品推荐

