C# winform 控件DataBindings 更新数据 笔记

本文探讨了如何在WinForm项目中提高datagridview数据更新的效率,对比了传统的循环更新方法与WPF的DataBindings绑定方式。通过实现INotifyPropertyChanged接口,实现了对象属性改变时界面自动更新。同时,介绍了在多线程环境下,如何通过委托事件安全地更新控件如textbox的数据,并强调了子线程中修改UI元素需要注意的事项。

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

最近在写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; 不能再子线程里面直接操作,如果要在子线程里面操作,需要在委托事件里面执行。不然界面不会更新值。(遇到的问题)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值