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

 

 

目录

 

 问题

解决方法一

解决方法二



 问题

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

解决方法一

使用

this.dataGridView.Invalidate();

强制刷新。

解决方法二

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

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

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

class ProcedureNameVo : INotifyPropertyChanged
        {
            ///


            /// 存储过程名
            ///

            public string procedureName { get; set; } = "存储过程名(英文)";

            public bool _isExist = false;
            ///


            /// 存储过程是否存储
            ///

            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对象,可以定点更新

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

你可能感兴趣的:(C#,winForm)