DataGridView解决使用BindingList时属性改变界面不更新问题

本文探讨了在使用BindingList作为DataGridView数据源时,界面刷新的问题及解决方案。详细介绍了两种刷新方法:一是使用dataGridView.Invalidate()强制刷新;二是实现INotifyPropertyChanged接口,使属性更改时自动刷新界面。建议对于小数据量使用第一种方法,对于需要精细化更新的情况采用第二种。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

目录

 

 问题

解决方法一

解决方法二



 问题

在使用BindingList作为DataGridView的数据源时,当BindingList<>有增加或者删除的时候DataGridView会自动刷新,但是当BindingList<>中属性内容进行更新的时候界面并不会刷新

解决方法一

使用

this.dataGridView.Invalidate();

强制刷新。

解决方法二

使用BindingList绑定时,数据确实双向同步改变,但刷新并不会实时更新,是因为实体类没有实现INotifyPropertyChanged接口,实现相关接口即可。

dataGridView中没有及时刷新显示新数据。因为数据修改时并没有通知到控件,为此实现INotifyPropertyChanged接口,该接口只包含一个事件,当属性值改变时,触发该事件,从而导致注册该事件的方法被执行,达到通知控件的目的。这是通过事件实现观察者模式。

关键代码在VO实体对象时,当改变值时,抛出PropertyChanged事件

class ProcedureNameVo : INotifyPropertyChanged
        {
            /// <summary>
            /// 存储过程名
            /// </summary>
            public string procedureName { get; set; } = "存储过程名(英文)";

            public bool _isExist = false;
            /// <summary>
            /// 存储过程是否存储
            /// </summary>
            public bool isExist {
                get
                {
                    return _isExist;
                }

                set {
                    if (_isExist != value)
                {
                        _isExist = value;
                    PropertyChanged(this, new PropertyChangedEventArgs("isExist"));
                }
                }
            }
            public event PropertyChangedEventHandler PropertyChanged = delegate { };
        }

 比如上面代码当改变isExist时,界面会实时刷新,当改变procedureName值时不会刷新,是因为改变isExist值时,抛出的事件。

 

总结

方法一相对简单,每次手动刷新界面,每次调用是全局刷新

方法二稍微复杂点,要重构vo对象,可以定点更新

对表格数据量小的使用方法一。精细化的使用方法二。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值