.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"; } }
运行程序可以发现,如果用户改变文本框中的值,点击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>类型的数据源。