用最简单的方式来看,数据绑定牵涉了将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.)。
好,绑定到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来获得类似集合的迭代能力。