ASP.NET数据服务提供了Web窗体页和数据源(或数据库)之间的数据交互功能。其中,数据服务功能主要包括数据绑定技术、数据源控件、数据控件(如Repeater、DataList、GridView、DetailsView、FormView等控件)。
|
|
除特别说明之外,如果本章节中的代码实例使用了WEB2ASPNET2DB数据库,那么该数据库的连接字符串保存在配置文件Web.Config中,具体代码如下。 |
<connectionStrings>
<add name="WEB2ASPNET2DBConnectionString"
connectionString="Data Source=localhost;
Initial Catalog=WEB2ASPNET2DB;User ID=sa;Password=123456"
providerName="System.Data.SqlClient"/>
</connectionStrings>
5.1 数据绑定技术
在ASP.NET中,服务器控件可以直接与数据源进行交互(如显示或修改数据),ASP.NET称这种技术为数据绑定技术。它可以把Web窗体页(包括其控件或其他元素)和数据源无缝地连接到一起,增强了页与数据源的交互能力。数据绑定技术可以分为简单数据绑定技术和复杂数据绑定技术。
5.1.1 简单数据绑定技术
简单数据绑定技术能够将控件的属性绑定到数据源中的某一个值,并且这些值将在页运行时确定。简单数据绑定技术包括了数据绑定表达式和DataBind()方法两部分内容。
1.数据绑定表达式语法
数据绑定表达式语法可以创建服务器控件的属性和数据源之间的绑定。数据绑定表达式不但可以包含在Web窗体页中的任何位置,而且可以包含在服务器控件开始标记中的“属性/值”的一侧。声明数据绑定表达式的语法如下:
<tagprefix:tagname property="<%# data-binding expression %>"
runat="server" />
- 或者 -
文本 <%# data-binding expression %>
其中,property参数表示控件的属性,data-binding expression为数据绑定表达式。
|
|
数据绑定表达式必须放置在“<%# ”和“ %>”标记元素之间。 |
下面的代码实例使用了4个数据绑定表达式。第一个和第三个表达式直接在Web窗体页上显示表达式的值;第二个表达式设置ListBox控件的数据源;第四个表达式先计算函数GetUser(userID)的结果,然后显示该结果。
<%# ID %>
<asp:ListBox id="lbUser" datasource='<%# myArray %>' runat="server">
<%# (user.UserName + "-" + user.ID) %>
<%# GetUser(userID) %>
2.DataBind()方法
一般情况下,数据绑定表达式不会自动计算它的值,除非它所在的页或者控件显示调用DataBind()方法。DataBind()方法能够将数据源绑定到被调用的服务器控件及其所有子控件,同时分析并计算数据绑定表达式的值,它的原型如下。
(1)public override void DataBind()。
(2)protected virtual void DataBind(bool raiseOnDataBinding)。
其中,raiseOnDataBinding参数表示是否触发页或者控件的DataBinding事件。
下面的代码实例在SimpleBinder.aspx页面中使用了两个数据绑定表达式。第一个表达式用当前时间设置Button控件的Text属性的值;第二个表达式也用当前时间设置TextBox控件的Text属性的值。
|
|
SimpleBinder.aspx页面在它的Page_Load(object sender,EventArgs e)事件中调用了DataBind()方法来绑定页的数据。 |
<!-- Sample_05_01的SimpleBinder.aspx页面 -->
<%@ Page Language="C#" %>
<script runat="server">
protected void Page_Load(object sender,EventArgs e)
{
this.DataBind(); ///绑定页面所有控件的数据
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title>简单数据绑定</title></head>
<body><form id="form1" runat="server">
<asp:Button ID="btnTime" runat="server"
Text='<%# DateTime.Now.ToString() %>' />
<asp:TextBox ID="tbTime" runat="server"
Text='<%# DateTime.Now.ToString() %>' />
</form></body>
</html>
上述代码实例的执行结果如图5.1所示。

图5.1 简单数据绑定技术
5.1.2 复杂数据绑定技术
复杂数据绑定技术能够将一组或一列值绑定到指定的控件,这些控件通常被称为数据绑定控件,如ListBox、DropDownList、Repeater、GridView等控件。这些数据绑定控件可以分为两类:列表控件和和迭代控件。其中,迭代控件包括Repeater、DataList和GridView等控件(这些控件将在后面进行详细介绍)。
列表控件包括5个控件:BulletedList、CheckBoxList、RadioButtonList、ListBox和DropDownList,它们都是从BaseDataBoundControl类派生。然而,列表控件并不是直接派生于BaseDataBoundControl类,而是直接派生于ListControl类,并且,ListControl类直接继承于DataBoundControl类,DataBoundControl类直接继承于BaseDataBoundControl类。上述类之间的继承关系如图5.2所示。
BaseDataBoundControl类包含两个与数据绑定相关的属性:DataSource和DataSourceID。DataBoundControl类包含了一个与数据绑定相关的属性:DataMember。这3个属性的描述如表5-1所示。
表5-1 BaseDataBoundControl和DataBoundControl类与数据绑定相关的属性
|
属 性 |
描 述 |
|
DataSource |
数据源,控件从其中检索数据项列表 |
|
DataSourceID |
数据源控件的ID,控件从该数据源控件中检索其数据项列表 |
|
DataMember |
若数据源包含多个数据项时,该属性指定与该控件相关的数据项 |
列表控件(ListControl)提供了多个与数据绑定相关的属性,如AppendDataBoundItems、DataTextField、DataValueField等,它们的说明如表5-2所示。
表5-2 DataBoundControl控件的属性
|
属 性 |
描 述 |
|
AppendDataBoundItems |
是否在绑定数据之前清除列表项 |
|
DataTextField |
列表项的文本的数据源字段 |
|
DataValueField |
列表项的值的数据源字段 |
|
DataTextFormatString |
列表项的文本的格式化字符串 |
续表
|
属 性 |
描 述 |
|
DataKeyField |
数据源中的键字段名称 |
|
Items |
控件的项的集合 |
|
SelectedItem |
控件的选择项 |
|
SelectedIndex |
控件选择项的索引 |
|
SelectedValue |
控件选择项的值 |
|
AutoPostBack |
当用户更改列表中的选择项时,是否回发到服务器 |
|
CausesValidation |
在单击控件时,是否执行验证 |
|
Text |
控件选择项的文本值 |
|
ValidationGroup |
所属验证组的名称 |

图5.2 列表控件和它们的基类的继承关系图
列表控件的Items属性保存了控件的所有项。每一项都是一个ListItem对象,该对象提供了5个属性,如表5-3所示。
表5-3 ListItem控件的属性
|
属 性 |
描 述 |
|
Attributes |
保存除了基本属性之外的属性的集合 |
|
Enabled |
项是否可用 |
续表
|
属 性 |
描 述 |
|
Selected |
项是否被选定 |
|
Text |
项的文本 |
|
Value |
项的值 |
另外,列表控件还提供了绑定控件数据的DataBind()方法和3个事件。其中,这3个事件的说明如下。
DataBound事件,在控件绑定数据源后触发。
SelectedIndexChanged事件,当列表控件的选择项发生变化时,触发该事件。
TextChanged事件,当控件的Text属性或者选择项的Text属性发生变化时,触发该事件。
下面的代码实例在ComplexBinder.aspx页面中创建一个ArrayList对象colors,并在该对象中添加了“Red”、“Blue”、“Green”、“Black”、“Yellow”和“Gray”6个值,这些值分别表示6种颜色。ComplexBinder.aspx页面将colors设置为ListBox控件lbColor的数据源,并绑定其数据。
|
|
lbColor控件还定义了SelectedIndexChanged事件,该事件把lbColor控件的前景颜色设置为当前选择项所指定的颜色。 |
<!-- Sample_05_01的ComplexBinder.aspx页面 -->
<%@ Page Language="C#" %>
<script runat="server">
protected void Page_Load(object sender,EventArgs e)
{
if(!Page.IsPostBack)
{ ///创建颜色数组
System.Collections.ArrayList colors = new ArrayList();
colors.Add("Red");
colors.Add("Blue");
colors.Add("Green");
colors.Add("Black");
colors.Add("Yellow");
colors.Add("Gray");
///把colors设置为ListBox控件lbColor的数据源,并绑定控件的数据
lbColor.DataSource = colors;
lbColor.DataBind();
}
}
protected void lbColor_SelectedIndexChanged(object sender,EventArgs e)
{
if(lbColor.SelectedIndex > -1)
{ ///把控件的前景颜色设置为选择项的颜色
lbColor.ForeColor = System.Drawing.Color.FromName(
lbColor.SelectedItem.Text);
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title>复杂数据绑定</title></head>
<body><form id="form1" runat="server">
<asp:ListBox ID="lbColor" runat="server" Rows="10" Width="200px"
AutoPostBack="True"
OnSelectedIndexChanged="lbColor_SelectedIndexChanged">
</asp:ListBox>
</form></body>
</html>
上述代码实例的执行结果如图5.3所示。

图5.3 复杂数据绑定技术
5.1.3 Eval()和Bind()方法
Eval()和Bind()方法是数据绑定时两种重要方法,其中,Eval()方法定义在DataBinder类中,该类用来生成和分析数据绑定表达式语法,它的方法如表5-4所示。
表5-4 DataBinder类的方法
|
方 法 |
描 述 |
|
Eval() |
在运行时,使用反射分析和计算对象的数据绑定表达式的值 |
|
GetDataItem() |
对象的数据项 |
|
GetPropertyValue() |
属性的值 |
|
GetIndexedPropertyValue() |
索引的值 |
Eval()方法可以分析和计算数据表达式的值,并返回计算的结果,其原型如下。
(1)public static Object Eval(Object container,string expression)。
(2)public static string Eval(Object container,string expression,string format)。
其中,container参数表示数据的容器,Eval()方法从该容器中获取数据。expression参数为获取或检索数据的路径,即绑定数据的字段在数据容器中的导航路径,它的值可以为类中的公开属性或表的字段名称。format参数为表达式值的格式化字符串。
|
|
在上述两个方法中,第一个方法返回结果的数据类型为对象,第二个方法返回结果的数据类型为字符串。 |
Bind()和Eval()方法相比,它们最大的区别在于:Eval()方法只能够显示数据;Bind()方法不但可以显示数据,而且还能够修改数据。通常,Bind()方法被GridView、DetailsView、FormView等控件使用。这些控件使用Bind()方法不但可以显示数据,而且还可以修改数据。下面的代码实例中的数据绑定表达式使用了Bind()方法。
<%# Bind("Email") %>







