.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设计器自动生成的代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值