使用数据绑定语法,可以将控件属性值绑定到数据,并指定值以对数据进行检索、更新、删除和插入操作。
数据绑定语法
数据绑定表达式包含在 <%# 和 %> 分隔符之内,并使用 Eval 和 Bind 函数。Eval 函数用于定义单向(只读)绑定。Bind 函数用于定义双向(可更新)绑定。除了通过在数据绑定表达式中调用 Eval 和 Bind 方法执行数据绑定外,还可以调用 <%# 和 %> 分隔符之内的任何公共范围代码,以在页面处理过程中执行该代码并返回一个值。
调用控件或 Page 类的 DataBind 方法时,会对数据绑定表达式进行解析。对于有些控件,如 GridView、DetailsView 和 FormView 控件,会在控件的 PreRender 事件期间自动解析数据绑定表达式,不需要显式调用 DataBind 方法。
下面的代码示例演示如何将数据绑定表达式与 ItemTemplate 中的 FormView 控件结合使用。
<asp:FormView ID="FormView1" DataSourceID="SqlDataSource1" DataKeyNames="ProductID" RunAt="server"> <ItemTemplate> <table> <tr><td align=right><B>Product ID:</B></td> <td><%# Eval("ProductID") %></td></tr> <tr><td align=right><B>Product Name:</B></td> <td><%# Eval("ProductName") %></td></tr> <tr><td align=right><B>Category ID:</B></td> <td><%# Eval("CategoryID") %></td></tr> <tr><td align=right><B>Quantity Per Unit:</B></td><td><%# Eval("QuantityPerUnit") %></td></tr> <tr><td align=right><B>Unit Price:</B></td> <td><%# Eval("UnitPrice") %></td></tr> </table> </ItemTemplate> </asp:FormView>
<asp:FormView ID="FormView1" DataSourceID="SqlDataSource1" DataKeyNames="ProductID" RunAt="server"> <ItemTemplate> <table> <tr><td align=right><B>Product ID:</B></td> <td><%# Eval("ProductID") %></td></tr> <tr><td align=right><B>Product Name:</B></td> <td><%# Eval("ProductName") %></td></tr> <tr><td align=right><B>Category ID:</B></td> <td><%# Eval("CategoryID") %></td></tr> <tr><td align=right><B>Quantity Per Unit:</B></td><td><%# Eval("QuantityPerUnit") %></td></tr> <tr><td align=right><B>Unit Price:</B></td> <td><%# Eval("UnitPrice") %></td></tr> </table> </ItemTemplate> </asp:FormView>
使用 Eval 方法
Eval 方法可计算数据绑定控件(如 GridView、DetailsView 和 FormView 控件)的模板中的后期绑定数据表达式。在运行时,Eval 方法调用 DataBinder 对象的 Eval 方法,同时引用命名容器的当前数据项。命名容器通常是包含完整记录的数据绑定控件的最小组成部分,如 GridView 控件中的一行。因此,只能对数据绑定控件的模板内的绑定使用 Eval 方法。
Eval 方法以数据字段的名称作为参数,从数据源的当前记录返回一个包含该字段值的字符串。可以提供第二个参数来指定返回字符串的格式,该参数为可选参数。字符串格式参数使用为 String 类的 Format 方法定义的语法。
使用 Bind 方法
Bind 方法与 Eval 方法有一些相似之处,但也存在很大的差异。虽然可以像使用 Eval 方法一样使用 Bind 方法来检索数据绑定字段的值,但当数据可以被修改时,还是要使用 Bind 方法。
在 ASP.NET 中,数据绑定控件(如 GridView、DetailsView 和 FormView 控件)可自动使用数据源控件的更新、删除和插入操作。例如,如果已为数据源控件定义了 SQL Select、Insert、Delete 和 Update 语句,则通过使用 GridView、DetailsView 或 FormView 控件模板中的 Bind 方法,就可以使控件从模板中的子控件中提取值,并将这些值传递给数据源控件。然后数据源控件将执行适当的数据库命令。出于这个原因,在数据绑定控件的 EditItemTemplate 或 InsertItemTemplate 中要使用 Bind 函数。
Bind 方法通常与输入控件一起使用,例如由编辑模式中的 GridView 行所呈现的 TextBox 控件。当数据绑定控件将这些输入控件作为自身呈现的一部分创建时,该方法便可提取输入值。
Bind 方法采用数据字段的名称作为参数,从而与绑定属性关联,如下面的示例所示:
<EditItemTemplate> <table> <tr> <td align=right> <b>Employee ID:</b> </td> <td> <%# Eval("EmployeeID") %> </td> </tr> <tr> <td align=right> <b>First Name:</b> </td> <td> <asp:TextBox ID="EditFirstNameTextBox" RunAt="Server" Text='<%# Bind("FirstName") %>' /> </td> </tr> <tr> <td align=right> <b>Last Name:</b> </td> <td> <asp:TextBox ID="EditLastNameTextBox" RunAt="Server" Text='<%# Bind("LastName") %>' /> </td> </tr> <tr> <td colspan="2"> <asp:LinkButton ID="UpdateButton" RunAt="server" Text="Update" CommandName="Update" /> <asp:LinkButton ID="CancelUpdateButton" RunAt="server" Text="Cancel" CommandName="Cancel" /> </td> </tr> </table> </EditItemTemplate>
单击行的 Update 按钮时,使用 Bind 语法绑定的每个控件属性值都会被提取出来,并传递给数据源控件以执行更新操作。
DataBind 是页和所有服务器控件的方法。当在父控件上调用 DataBind 时,它级联到该控件的所有子控件。例如,DataList1.DataBind() 将因此对 DataList 模板中的每一控件调用 DataBind 方法。在页上调用 DataBind — Page.DataBind() 或只是 DataBind() — 会导致计算页上的所有数据绑定表达式。通常从 Page_Load 事件调用 DataBind,如下例所示。
<script language="JavaScript" type="text/javascript"> function doClick(index, numTabs, id) { document.all("tab" + id, index).className = "tab"; for (var i=1; i < numTabs; i++) { document.all("tab" + id, (index + i) % numTabs).className = "backtab"; } document.all("code" + id, index).style.display = ""; for (var j=1; j < numTabs; j++) { document.all("code" + id, (index + j) % numTabs).style.display = "none"; } } </script>
protected void Page_Load(Object Src, EventArgs E) { DataBind(); } Protected Sub Page_Load(Src As Object, E As EventArgs) DataBind() End Sub protected function Page_Load(Src:Object, E:EventArgs) : void { DataBind(); } | |||
C# | VB | JScript |
如果绑定表达式在运行时计算为预期的数据类型,则可以在 .aspx 页的声明节中的几乎任何位置使用绑定表达式。上面的简单属性、表达式和方法示例在计算时向用户显示文本。这些情况下,数据绑定表达式必须计算为 String 类型的值。在集合示例中,数据绑定表达式计算为 ListBox 的 DataSource 属性的有效类型值。您可能会发现有必要转换绑定表达式中的类型值以产生所需的结果。例如,如果 count
是整数:
Number of Records:<%# count.ToString() %>
绑定到简单属性
ASP.NET 数据绑定语法支持绑定到公共变量、页的属性和页上其他控件的属性。
下面的示例说明如何绑定到公共变量和页上的简单属性。注意这些值在 DataBind()
调用前初始化。
2<head>
3 <script language="C#" runat="server">
4
5 void Page_Load(Object sender, EventArgs e) {
6 Page.DataBind();
7 }
8
9 string custID {
10 get {
11 return "ALFKI";
12 }
13 }
14
15 int orderCount {
16 get {
17 return 11;
18 }
19 }
20
21
22 </script>
23
24</head>
25<body>
26
27 <h3><font face="Verdana">DataBinding to a Property on the Page</font></h3>
28
29 <form runat=server>
30
31 Customer: <b><%# custID %></b><br>
32 Open Orders: <b><%# orderCount %></b>
33
34 </form>
35
36</body>
37</html>
38
39
下面的示例说明如何绑定到另一控件的属性
<head>
<script language="C#" runat="server">
void SubmitBtn_Click(Object sender, EventArgs e) {
// Rather than explictly pull out the variable from the "StateList"
// and then manipulate a label control, just call "Page.DataBind".
// This will evaluate any <%# %> expressions within the page
Page.DataBind();
}
</script>
</head>
<body>
<h3><font face="Verdana">DataBinding to a property of another server control</font></h3>
<form runat=server>
<asp:DropDownList id="StateList" runat="server">
<asp:ListItem>CA</asp:ListItem>
<asp:ListItem>IN</asp:ListItem>
<asp:ListItem>KS</asp:ListItem>
<asp:ListItem>MD</asp:ListItem>
<asp:ListItem>MI</asp:ListItem>
<asp:ListItem>OR</asp:ListItem>
<asp:ListItem>TN</asp:ListItem>
<asp:ListItem>UT</asp:ListItem>
</asp:DropDownList>
<asp:button Text="Submit" OnClick="SubmitBtn_Click" runat=server/>
<p>
Selected State: <asp:label text='<%# StateList.SelectedItem.Text %>' runat=server/>
</form>
</body>
</html>
绑定到集合和列表
像 DataGrid、ListBox 和 HTMLSelect 这样的列表服务器控件将集合用作数据源。下面的示例说明如何绑定到通常的公共语言运行库集合类型。这些控件只能绑定到支持 IEnumerable、ICollection 或 IListSource 接口的集合。最常见的是绑定到 ArrayList、Hashtable、DataView 和 DataReader。
下面的示例说明如何绑定到 ArrayList。
<head>
<script language="C#" runat="server">
void Page_Load(Object Sender, EventArgs E) {
if (!Page.IsPostBack) {
ArrayList values = new ArrayList();
values.Add ("IN");
values.Add ("KS");
values.Add ("MD");
values.Add ("MI");
values.Add ("OR");
values.Add ("TN");
DropDown1.DataSource = values;
DropDown1.DataBind();
}
}
void SubmitBtn_Click(Object sender, EventArgs e) {
Label1.Text = "You chose: " + DropDown1.SelectedItem.Text;
}
</script>
</head>
<body>
<h3><font face="Verdana">DataBinding DropDownList</font></h3>
<form runat=server>
<asp:DropDownList id="DropDown1" runat="server" />
<asp:button Text="Submit" OnClick="SubmitBtn_Click" runat=server/>
<p>
<asp:Label id=Label1 font-name="Verdana" font-size="10pt" runat="server" />
</form>
</body>
</html>
下面的示例说明如何绑定到 DataView。注意 DataView 类在 System.Data 命名空间
<html>
<head>
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e ) {
if (!Page.IsPostBack)
{
DataTable dt = new DataTable();
//dt为声明一个表
DataRow dr;
//表示Table中行的数据
dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
dt.Columns.Add(new DataColumn("DateTimeValue", typeof(DateTime)));
dt.Columns.Add(new DataColumn("BooleanValue", typeof(bool)));
//Columns为取值该表列的集合,
//Add.为该表添加到列的集合 DataColumn为列框架
//后面是列头的标题,后面表示该列的数据类型
for (int i = 1; i <= 9; i++)
{
dr = dt.NewRow();
//创建与该表具有相同框架新的数据行
dr[0] = i;
dr[1] = "Item " + i.ToString();
dr[2] = DateTime.Now;
dr[3] = (i % 2 != 0) ? true : false;
//为数据行添加数值
dt.Rows.Add(dr);
//把获得数值的指定的行加到该表的集合
}
dataGrid1.DataSource = new DataView(dt);
//把该表作为数据源 放到dataGrid1中
dataGrid1.DataBind();
}
}
</script>
</head>
<body>
<h3><font face="Verdana">Databinding to a DataView</font></h3>
<form runat=server>
<asp:DataGrid id="dataGrid1" runat="server"
BorderColor ="black"
BorderWidth ="1"
GridLines ="Both"
CellPadding ="3"
CellSpacing ="0"
HeaderStyle -BackColor="#aaaadd"
/>
</form>
</body>
</html>
下面的示例说明如何绑定到 Hashtable
<head>
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e) {
if (!Page.IsPostBack) {
Hashtable h = new Hashtable();
h.Add ("key1", "value1");
h.Add ("key2", "value2");
h.Add ("key3", "value3");
MyDataList.DataSource = h;
MyDataList.DataBind();
}
}
</script>
</head>
<body>
<h3><font face="Verdana">DataBinding to a Hashtable</font></h3>
<form runat=server ID="Form1">
<asp:DataList id="MyDataList" runat="server"
BorderColor ="black"
BorderWidth ="1"
GridLines ="Both"
CellPadding ="4"
CellSpacing ="0"
>
<ItemTemplate>
<%# ((DictionaryEntry)Container.DataItem).Key %> :
<%# ((DictionaryEntry)Container.DataItem).Value %>
</ItemTemplate>
</asp:DataList>
</form>
</body>
</html>
绑定表达式或方法
通常需要在绑定到页或控件之前操作数据。下面的示例说明如何绑定到表达式和方法的返回值。
<head>
<script language="C#" runat="server">
void Page_Load(Object Src, EventArgs E) {
if (!Page.IsPostBack) {
ArrayList values = new ArrayList();
//新建一个数组实例value
values.Add (0);
values.Add (1);
values.Add (2);
values.Add (3);
values.Add (4);
values.Add (5);
values.Add (6);
//给数组增加值
DataList1.DataSource = values;
DataList1.DataBind();
//把数组绑定到DataList1
}
}
String EvenOrOdd( int number) {
if ((number % 2) == 0)
return "Even";
else
return "Odd";
//这里新建了一方法EvenOrOdd 接收传递进来的参数number
// 然后进行计算然后返回结果
}
</script>
</head>
<body>
<h3><font face="Verdana">Databinding to Methods and Expressions</font></h3>
<form runat=server ID="Form1">
<asp:DataList id="DataList1" runat="server"
BorderColor ="black"
BorderWidth ="1"
GridLines ="Both"
CellPadding ="3"
CellSpacing ="0"
>
<ItemTemplate>
Number Value: <%# Container.DataItem %><br>
Even /Odd: <%# EvenOrOdd((int) Container.DataItem) %>
// 这里必须小心的注意语句 EvenOrOdd((int) Container.DataItem) 是把(int)Container.DataItem
// 作为一个整体参数传递方法EvenOrOdd 这个是值得我去学习
// 就是把一个数据绑定的数据,通过计算 然后返回一个 数据绑定的结果,
//这也说明 我们可以对对数据绑定的数据进行操作了
</ItemTemplate>
</asp:datalist>
</form>
</body>
</html>
ASP.NET Framework 提供了一种静态方法,计算后期绑定的数据绑定表达式并且可选择将结果格式化为字符串。DataBinder.Eval 很方便,因为它消除了开发人员为强迫将值转换为所需的数据类型而必须做的许多显式转换。这在数据绑定模板列表内的控件时尤其有用,因为通常数据行和数据字段的类型都必须转换。
请看下面的示例,本例中整数将显示为货币字符串。使用标准的 ASP.NET 数据绑定语法,必须首先转换数据行的类型以便检索数据字段 IntegerValue
。下一步,将此作为参数传递给 String.Format 方法。
<%# String.Format("{0:c}", ((DataRowView)Container.DataItem)["IntegerValue"]) %> <%# String.Format("{0:c}", (CType(Container.DataItem, DataRowView)("IntegerValue"))) %> <%# String.Format("{0:c}", (DataRowView(Container.DataItem))["IntegerValue"]) %> | |||
C# | VB | JScript |
该语法可能比较复杂,难以记忆。相反,DataBinder.Eval 是只有三个参数的简单方法:数据项的命名容器、数据字段名和格式字符串。在像 DataList、DataGrid 或 Repeater 这样的模板列表中,命名容器始终是 Container.DataItem
。Page 是另一个可与 DataBinder.Eval 一起使用的命名容器。
<%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %> <%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %> <%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %> | |||
C# | VB | JScript |
格式字符串参数是可选的。如果省略它,则 DataBinder.Eval 返回对象类型的值,如下例所示。
<%# (bool)DataBinder.Eval(Container.DataItem, "BoolValue") %> <%# CType(DataBinder.Eval(Container.DataItem, "BoolValue"), Boolean) %> <%# Boolean(DataBinder.Eval(Container.DataItem, "BoolValue")) %> | |||
C# | VB | JScript |
DataBinder.Eval 会对标准数据绑定语法带来很明显的性能损失,因为它使用后期绑定反射,注意这一点很重要。使用 DataBinder.Eval 时需谨慎,尤其是在不需要字符串格式化时。
|
<html>
<head>
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e) {
if (!Page.IsPostBack) {
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
dt.Columns.Add(new DataColumn("DateTimeValue", typeof(DateTime)));
dt.Columns.Add(new DataColumn("BoolValue", typeof(bool)));
for (int i = 0; i < 9; i++) {
dr = dt.NewRow();
dr[0] = i;
dr[1] = "Item " + i.ToString();
dr[2] = DateTime.Now;
dr[3] = (i % 2 != 0) ? true : false;
dt.Rows.Add(dr);
}
dataList1.DataSource = new DataView(dt);
dataList1.DataBind();
//我对建表的理解 首先把表头建好, 然后声明一个表列的实例 把这个实例加到表中
// 并为为这个表列增加参数
}
}
</script>
</head>
<body>
<h3><font face="Verdana">Databinding Using DataBinder.Eval</font></h3>
<form runat=server ID="Form1">
<asp:DataList id="dataList1" runat="server"
RepeatColumns ="3"
Width ="80%"
BorderColor ="black"
BorderWidth ="1"
GridLines ="Both"
CellPadding ="4"
CellSpacing ="0"
>
<ItemTemplate>
Order Date: <%# DataBinder.Eval(Container.DataItem, "DateTimeValue", "{0:d}") %>
<p>
Quantity: <%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:N2}") %>
<p>
Item: <%# DataBinder.Eval(Container.DataItem, "StringValue") %>
Order Date: <asp:CheckBox id=chk1 Checked='<%# (bool)DataBinder.Eval(Container.DataItem, "BoolValue") %>' runat=server/>
//上面这几个要注意DataBinder.Eval的用法和 {O:d}和{0:N2}代表的意思
<p>
</ItemTemplate>
</asp:Datalist>
</form>
</body>
</html>
本节小结
- ASP.NET 声明性数据绑定语法使用 <%# %> 表示法。
- 可以绑定到数据源、页或其他控件的属性、集合、表达式以及从方法调用返回的结果。
- 列表控件可以绑定到支持 ICollection、IEnumerable 或 IListSource 接口的集合,如 ArrayList、Hashtable、DataView 和 DataReader。
- DataBinder.Eval 是用于晚期绑定的静态方法。它的语法可能比标准数据绑定语法简单,但性能较低。