C# 控件DataBinding问题

来源:互联网 发布:零售业数据公式 编辑:程序博客网 时间:2024/06/05 00:08
//此为第三次重改结果
//第一次,常规绑定,即直接绑定_binSource数据源,即:Pic.DataBindings.Add(new Binding("Image", bdSource, _Field);
//问题:数据无法同步刷新,前台控件的数据值无法同步写入绑定值内
//第二次,添加第四/第五参数,即
true, DataSourceUpdateMode.OnPropertyChanged;
//问题:前台控件数据更新正常,但手动修改值时,不能写入绑定值内,原因为前台控件操作会激活焦点失去事件,而此事件将激活绑定事件,但手动修改则不会激活
//以上内容在Dev15的控件中不存在此类情况.我是纯找虐型.... 


绑定方法:
private BindingSource bdSource = new BindingSource();//此设计将解决外部赋值无法刷新绑定值的问题
//先用BindingSource 承接外部数据源
 bdSource.DataSource = _binSource;
//2.清除原控件绑定内容
 Pic.DataBindings.Clear();
//3.添加控件的绑定,而非直接的数据源绑定 
Pic.DataBindings.Add(new Binding("Image", bdSource, _Field, true, DataSourceUpdateMode.OnPropertyChanged));


//手动赋值时:
public void SetValue(object value)
        {
            Pic.Image = (Image)value;
            bdSource.EndEdit();//此行不可少,赋值后必须加endedit才会更新对应的绑定值
        } 

//第三次BUG,多控件绑定时,会判断DBNULL的情况
//此为引用自http://blog.csdn.net/jjhua/article/details/24326171 解决方法
using System.ComponentModel;
public class Test : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        double a;
        double b;
        public double A {
            get { return this.a; }
            set
            {
                if (value != this.a)
                {
                    this.a = value;
                    this.RaisePropertyChanged("A");
                }
            }
        }
        public double B { get; set; }
        private void RaisePropertyChanged(string propertyName)
        {
            var handler = this.PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    } 


//此BUG最终解决方案及架构中的特殊解决办法:
//一,主控件中绑定方法
bdSource.DataSource = _binSource;
            dEdit.DataBindings.Clear();
            //第四个参数为强制格式转换开启
            dEdit.DataBindings.Add("ValueX", bdSource, _Field, true, DataSourceUpdateMode.OnPropertyChanged);
//二.子控件中引用接口INotifyPropertyChanged 
        public DateTime? ValueX
        {
            get { return valueX; }
            set
            {
                if (value == null)
                {
                    valueX = value;
                    SetNullText();
                }
                else
                {
                    this.CustomFormat = FormatString;
                    this.Value = value.Value;
                    valueX = value;
                }
                //this.OnValueChanged(null);        //调用此事件无效   待查验
                //return; 
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("valueX"));
                }
            }
        }


        public event PropertyChangedEventHandler PropertyChanged; 




第N次解决方案结果示例:[PropertyChanged方法需绑定的值为当前控件属性,子控件无法处理,只适用于继承控件]
Pic.DataBindings["Image"].WriteValue();
来源:http://www.cnblogs.com/jdmei520/archive/2009/02/23/1396658.html