日期:2011-07-11  浏览次数:20839 次

如果回到Visual Basic的时代,数据绑定(data binding)是一项被遗弃的笨拙编程技术。DAO过分简单和速度缓慢的控件让数据绑定得了个坏名声,许多有经验的开发人员根本就不是用它。当时很普遍的看法是:“真正的程序员不吃蛋奶饼,而他们肯定也不用数据绑定!”

但是有了.NET之后,许多东西都发生了改变,其中一个变化是在快速应用程序开发中用于数据源的绑定控件具有了高效率。事实上,.NET让整个数据绑定的概念超越了原有简单地把控件附加到数据表格上的概念。这种能力对ASP.NET的开发人员尤其有用,因为这就更多地把他们同应用程序数据访问层的反复无常隔绝起来。

数据绑定101:DataSet 

用最简单的方式来看,数据绑定牵涉了将ASP.NET的Web控件,例如说ListBox,附加到包含一些数据库数据的DataSet上。ListBox.DataSource属性让你指定控件要绑定的DataSet,而DataBind方法会真正地用数据来填充控件。由于DataSet可以包含多个字段,所以带有单个数据列的控件(ListBox、DropDownList等等)都会公开DataTextField和DataKeyField属性,这样你就能够分别指定控件将要以文本形式显示的字段名或者用于值的字段名。

Listing A包含了一个简单的例子,它将ListBox绑定到Northwind示例数据库的Categories表格上。在创建了DataSet之后,我用DataSource属性将它绑定到ListBox1。然后把DataTextField属性设置为CategoryName,后者是ListBox1应该显示的字段(它会被用作SelectedItem.Text),把DataKeyField属性设置为CategoryId,这样ListBox1就会把它用作键。(它会被返回为SelectedItem.Value.)。

数据绑定201:数组和集合

好,绑定到DataSet是小孩的把戏。但是如果你所要的数据不在数据库里,那又会怎么样呢?如果你想让用户能够从对象数列里进行选择,那又会怎么样呢?当然,你能够手动创建包含有数据的DataSet,但是这有点像要盖一座大楼,而你所需要的其实是一个工具棚。如果你只需要直接绑定到数组上,这是不是会很好?

事实的确如此,你可以直接绑定到参照类型变量的数组,这正如Listing B。在本文里,我有一个类——DataClass,它公开了两个属性,Description和ID。我可以创建一个DataClass对象的数组,并将它绑定到ListBox1,这和我在Listing A里对DataSet所做的一样:把DataTextField设置为Description(描述),把DataKeyField设置为ID。

ASP.NET使用实时的Reflection API来检查数组里的对象并找到正确的属性,它然后会把它们载入到ListBox1的ListItemCollection里。要注意,ASP.NET会专门去寻找property的成员——公共变量或者函数方法在这里都不起作用。

Listing C说明集合同样能够很好的工作,这其实并不会让你以外,因为我敢肯定到现在这个时候,你应该已经非常了解.NET是如何使用IEnumerable and IEnumerator interfaces to iterate over collections的。如果你碰巧不知道我在说什么,试着看看将ListBox1绑定到CollectionClass的Listing D,它通过实现Ienumerable和Ienumerator来获得类似集合的迭代能力。

数据绑定301:DataGrid

  对DataGrid和相关控件的数据绑定也是类似的,只不过你要处理的可能是控件里一个以上的列——否则,为什么要用DataGrid呢?DataGrid缺省的绑定行为相当智能:所有的列(在使用DataSet的情况下)或者公共属性(在对其他对象的情况下)会被显示出来。所以只设置DataSource属性会给你一个函数数据绑定方格。

当然在有些情况下,你不想用DataGrid来为自己创建列。你可以取消缺省的列自动生成的行为,并把AutoGenerateColumns属性设置为伪(false),这样就能够控制DataGrid的列的生成和绑定。然后你就可以使用Visual Studio .NET 的列属性编辑器为格创建列,如图 A所示,或者通过为DataGrid所应该包含的每个列创建一个System.Web.UI.WebControls.BoundColumn实例来实现这一点.

图A

Visual Studio .NET提供了一个优秀的列属性编辑器

Listing E重新编写了Listing C里集合绑定的例子,以此来操作DataGrid。我首先关闭了DataGrid1里列自动生成的特性,然后创建了一个新的BoundColumn对象。通过使用DataField属性,我把列对象绑定到DataClass的Description属性上,再把它添加到DataGrid1的列集合里。


毕业典礼!

数据绑定不仅仅是快速应用程序开发的一个重要方法,它还有助于将你数据结构的细节对应用程序的表示层隐藏起来。但是通过同样的机制来绑定数据库和对象数据,微软让在应用程序里使用数据绑定控件更加实用了。