C# WINFORM 控件双向绑定少为人知的秘密

1 篇文章 0 订阅
1 篇文章 0 订阅

在做winform开发的时候常常会遇到控件绑定数据源来实现双向绑定更新的问题。

根据这么多年的经验现在整理一下供大家参考,有什么写错的地方请指教:

现提供两个简单封装的绑定方法

 /// <summary>
        /// 将绑定数据源和控件绑定
        /// </summary>
        /// <param name="ctl">控件</param>
        /// <param name="propertyName">属性名称</param>
        /// <param name="BindingSource">数据源</param>
        /// <param name="fieldName">绑定字段</param>
        public void SetBinding(System.Windows.Forms.Control ctlstring propertyNameobject BindingSourcestring fieldName)
        {
            if (ctl.DataBindings[propertyName!= nullctl.DataBindings.Remove(ctl.DataBindings[propertyName]);
            ctl.DataBindings.Add(propertyNameBindingSourcefieldNametrueDataSourceUpdateMode.OnPropertyChanged);
        }
 
        /// <summary>
        /// 将绑定数据源和控件绑定,默认绑定Text属性
        /// </summary>
        /// <param name="ctl">控件</param>
        /// <param name="BindingSource">数据源</param>
        /// <param name="fieldName">绑定字段</param>
        public void SetBinding(System.Windows.Forms.Control ctlobject BindingSourcestring fieldName)
        {
            SetBinding(ctl"Text"BindingSourcefieldName);
        }

用上这两个方法调用控件绑定则世界清静了许多。

 

但是这只是单向绑定而已,如代码指定的,当空间属性值发生变更的时候同步到数据源。

   ctl.DataBindings.Add(propertyNameBindingSourcefieldNametrueDataSourceUpdateMode.OnPropertyChanged);

这边一个IsFormattingEnable设置成了true,这个属性必须引起重视。当控件的值是objet或者decimal,int等非string类型的时候这个属性有大用途,设置成false可能导致控件值丢失。

 

好了说说双向绑定的,我们用DataSet,DataTable等作为Grid的数据源的时候Framework的内部机制是有进行双向绑定的。但是对于其他类似于TextBox的控件就不是那么的美了,经过大量的测试发现TextBox之类的控件用DataView作为数据源可实现双向绑定,即当数据源发生变更的时候控件的值会自动发生变更。有DataTable.DefaultView可供调用

 

然后说说ColumnChange事件,大家都知道数据表的ColumnChange是一个好东西,就是给我们做行数据变更判断的,我们做数据判断一般是判断数据源的值,做数据修改一般也是修改数据源的值,一般不直接判断控件的值后者修改控件的值。

 
  void InnerTable_ColumnChanged(object senderDataColumnChangeEventArgs e)
        {           
            if (e.Column.ColumnName == "SHIPPER_ID")
            {
                if ( e.ProposedValue == null || e.ProposedValue.ToString() == "")
                {
                    e.Row.BeginEdit();
                    e.Row["SHIPPER_TEL"= null;
                    e.Row["SHIPPER_CERTIFICATE"= null;
                    e.Row.EndEdit();
                    return;
                }
              }
     }

 

一般比较保险的写法如上,ProposedValue是object类型,如果这边对改行进行值修改的时候一定要写BeginEdit,和Endedit,否则双向绑定失效,数据源的GetChange失效,Merger方法也失效,这个要特别注意否则你就悲催了。

OK,写完收工睡觉。

 

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yangyuanlife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值