.Net 中Textbox控件的数据绑定

   .Net的数据绑定还是挺博大精深的,最常用的就是绑定一个DataTable到一个DataGridView上面,不过这个不是本文的重点,本文主要介绍如何绑定一个实体类的某个字段到TextBox上,这在实际应用中是最常见的。如果代码中改变实体类的一个字段的值,界面上能够相应改变,反之,如果用户改变界面上的值,实体类能够自动改变,这能够极大的减轻编程的工作量。

   TextBox有个DataBindgs属性,用来设置绑定。它的使用很简单,只需要使用textBox.DataBings.Add()方法来为其设置绑定。Add方法有一个重载是接受一个Binding对象,还有一个是接受三个参数,分别是要绑定到TextBox的哪个属性上,哪个对象是数据源,绑定数据源的哪个字段。例如有下列实体类:

class Entity 
{
    private string field;
    public string Field
    {
        get { return field; }
        set
        {
            field = value;
        }
    }
}
 
我们要绑定其中的Field字段的值到textbox1的Text属性上,只需要如下代码:
textBox1.DataBindings.Add("Text", obj, "Field");    
完整的测试代码如下:

首先新建一个WindowsApplicaton项目,在一个空白的Form上面放上一个TextBox和两个Button,其中一个button用来显示实体类的值,另一个button用来在代码中改变实体类的值。代码如下:

public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }
       Entity obj = new Entity();
       private void Form1_Load(object sender, EventArgs e)
       {          
           textBox1.DataBindings.Add("Text", obj, "Field");      

       }

       private void button1_Click(object sender, EventArgs e)
       {
           MessageBox.Show(obj.Field);
       }

       private void button2_Click(object sender, EventArgs e)
       {
           obj.Field = "wow";
           
       }
   }

test

运行程序可以发现,如果用户改变文本框中的值,点击button1可以看到实体类的值已经改变,然而点击button2之后文本框的值却没有改变。这仅仅实现了单向的绑定。

     经过尝试,发现如果要实现双向绑定,对数据源有一定的要求,例如,如果数据源实现了INotifyPropertyChanged 接口就可以。这个接口位于System.CompomentModel命名空间中,这个接口很简单,只有一个事件。不过它提供了一种机制可以通知被绑定的对象,数据源已经发生了改变。下面的代码是实现了这个接口的实体类:

class Entity:INotifyPropertyChanged
{
    private string field;
    public string Field
    {
        get { return field; }
        set
        {
            field = value;
            SendChangeInfo("Field");
        }
    }

    private void SendChangeInfo(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

把实体类改成这样之后,再运行一下程序,就可以发现点击button2的时候textbox的内容立刻发生了改变。

    我查了下msdn,我没有找到在何处msdn明确说明实现了INotifyPropertyChanged接口的实体类可实现双向绑定,或许是在深入剖析数据绑定的文章中说的吧。我想到这样做是参考了Linq设计器自动生成的代码。

    下一篇打算研究下绑定的文本框(包括其他类型的控件)如何进行数据验证。还打算写一篇如何绑定DataTable或者IList<T>类型的数据源。

posted @ 2009-11-06 20:07  yinzixin  阅读(2180)  评论(10编辑  收藏  举报