最近在重构以前的代码,有个对各种不同控件绑定数据的功能。
比如 textbox1.DataBindings.Add("Text", this.BindingSource, entity.PropertyName); 给TextBox绑定相应的值。
但是各种控件赋值的属性名是不同的,有些是Text、Value、或者SelectText等等。
为了统一赋值,所以定义了一个接口public interface IDataValue
{
  object DataValue{get;set}
}所有控件,实现该接口,通过DataValue赋值。现在统一获取或设置值是OK了,但是绑定数据源出现了问题。
textbox1.DataBindings.Add("DataValue", this.BindingSource, entity.PropertyName);
这样绑定,TextBox能显示值,但是输入的值赋值无效,无法修改数据源。绑定到Text属性,可正常修改。
TextBox实现IDataValue如下public virtual object DataValue
        {
            get
            {
                if (string.IsNullOrEmpty(this.Text))
                {
                    return null;
                }
                return this.Text.Trim();
            }
            set
            {
                if (this.Text != value.ToString())
                {
                    this.Text = newValue;
                }
            }
是不是文本框内的值,只和Text属性有关,跟DataValue无关呢。这要如何实现?

解决方案 »

  1.   


    貌似不能。
    绑定到Text,只要焦点离开数据源就被修改了。
    但是DataValue不行,无法触发set。
      

  2.   

    你要做 绑定 方法,你要区别出 不同的数据源控件 它的父类是不同的 比如 GridView 和 DropdownList 就不是一个数据基础对象集成出来的 。所以你要区别开, 
    比如 你 GridView用 void BindData<T>(DataBindControl control,T datasouce)
    {}void BindData<T>(ListControl control,T datasouce)
    {
         control.DataFieldText
         .
         .
         .
    }以上的 方式。
      

  3.   

    正因为绑定数据的属性不同,我才定义了IDataValue接口,通过DataValue属性统一绑定。
    只是在修改控件上的值后,无法触发set