最近在写winform 的项目,需要对datagridview 进行动态更新数据。以前的做法是循环每一行,找到对应的那一行,然后循环每一列,更新数值,重绘gui。效率很低,而且占用资源高。
后来接触了WPF之后,发现是可以通过DataBindings 绑定对象来更新显示,只要修改对象属性值,界面也会跟着更新显示。
BindingList<DevDataShowView> showViewsLs = new BindingList<DevDataShowView>();
dataGridView1.DataSource = showViewsLs;
由于是多线程操作,在对showViewsLs 进行添加和删除的时候,需要使用委托事件来实现。
var dd=new DevDataShowView ();
if (dataGridView1.InvokeRequired)
{ dataGridView1?.Invoke(new MethodInvoker(() => showViewsLs.Add(dd);})); }
else { showViewsLs.Add(dd); }
上面是框架,然后是内容部分:
继承:INotifyPropertyChanged
public class DevDataShowView : INotifyPropertyChanged
{
int _sortNum;
[DisplayName("顺序号")] // 这是显示的列名称哦
public int SortNum
{
get { return _sortNum; }
set
{
if (_sortNum != value)
{
_sortNum = value;
NotifyPropertyChanged("SortNum");
}
}
}
........
PropertyChangedEventHandler _propertyChanged;
public event PropertyChangedEventHandler PropertyChanged
{
add { _propertyChanged += value; }
remove { _propertyChanged -= value; }
}
private void NotifyPropertyChanged(string property_name)
{
_propertyChanged?.Invoke(this, new PropertyChangedEventArgs(property_name));
}
}
数据对象实现INotifyPropertyChanged 的接口。
然后在多线程里面对 dd.SortNum 进行赋值,datagridview 上会实时更新。
2. 对于textbox 之类的控件,DataBindings 方式如下:
需要通过 BindingSource 来绑定 对象
//1.数据实体对象
var dd=new DevDataShowView ();
//2.BindingSource 对象
BindingSource.DataSource = dd;
textBox1.DataBindings.Add("Text", BindingSource, "SortNum");
//更新数据:
dd.SortNum=10;
//界面上面的textBox1 会显示10
//注:dd.SortNum=10; 不能再子线程里面直接操作,如果要在子线程里面操作,需要在委托事件里面执行。不然界面不会更新值。(遇到的问题)