本文介绍 ASP.NET 数据绑定。
有关其他 ASP.NET 概述,请参阅下面的 Microsoft 知识库文章:
305140
(http://support.microsoft.com/kb/305140/zh-cn/
)
ASP.NET 路线图
使用 ASP.NET 数据绑定,您可以将任何服务器控件绑定到简单的属性、集合、表达式和/或方法。如果您使用数据绑定,则当您在数据库中或通过其他方法使用数据时,您会具有更大的灵活性。
本文讨论了下列数据绑定主题:
数据绑定概要
<%# %> 语法
ASP.NET 介绍了一种新的声明性语法 <%# %>。该语法是在 .aspx 页中使用数据绑定的基础。所有数据绑定表达式都必须包含在这些字符中。下面的列表包含从多个源进行简单数据绑定的示例:
- 简单属性(用于客户的语法):
- 集合(用于订单的语法):
<asp:ListBox id="List1" datasource='<%# myArray %>' runat="server">
- 表达式(用于联系人的语法):
<%# ( customer.First Name + " " + customer.LastName ) %>
- 方法结果(用于未结清余额的语法):
<%# GetBalance(custID) %>
在前面的示例中,<%# %> 内联标记用于指示将把特定数据源中的信息放在 .aspx 页中的什么位置。以下数据绑定示例使用
TextBox Web 服务器控件:
<asp:textbox id=txt text="<%# custID %>" runat=server />
有关数据绑定语法的详细信息,请参阅以下 .NET Framework 软件开发工具包 (SDK) 文档:
Page.DataBind() versus Control.DataBind()
确定特定数据源并设置 .aspx 页上的对象之后,您必须将数据绑定到数据源。您可以使用
Page.DataBind 或
Control.DataBind 方法将数据绑定到数据源。
这两种方法的使用方式很相似。主要差别在于:调用
Page.DataBind 方法后,所有数据源都将绑定到它们的服务器控件。在显式调用 Web 服务器控件的
DataBind 方法或在调用页面级的
Page.DataBind 方法之前,不会有任何数据呈现给控件。通常,可以从
Page_Load 事件调用
Page.DataBind(或
DataBind)。
有关
DataBind 方法的详细信息,请参阅以下 .NET Framework SDK 文档:Control.DataBind 方法
http://msdn.microsoft.com/zh-cn/library/w5e5992d.aspx
(http://msdn.microsoft.com/zh-cn/library/w5e5992d.aspx)
数据绑定列表控件
该列表控件是可以绑定到集合的特殊 Web 服务器控件。您可以使用这些控件以自定义的模板格式显示数据行。所有列表控件都公开
DataSource 和
DataMember 属性,这些属性用于绑定到集合。
这些控件可以将其
DataSource 属性绑定到支持
IEnumerable、
ICollection 或
IListSource 接口的任一集合。
Repeater 控件
Repeater 控件是一个模版、数据绑定列表。
Repeater 控件是“无外观的”;即,它不具有任何内置布局或样式。因此,您必须在控件的模板中明确声明所有 HTML 布局标记、格式标记和样式标记。
以下代码示例向您演示了如何使用
Repeater 这一列表控件显示数据:
注意:您必须根据环境的需要修改连接字符串的参数。
Visual Basic .NET
<%@ Page Language="vb" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Dim cnn As SqlConnection = New SqlConnection("server=(local);" & _
"database=pubs;Integrated Security=SSPI")
Dim cmd As SqlDataAdapter = New SqlDataAdapter("select * from authors", cnn)
Dim ds As DataSet = New DataSet()
cmd.Fill(ds)
Repeater1.DataSource = ds
Repeater1.DataBind()
End Sub
</script>
<html>
<body>
<form id="Form1" method="post" runat="server">
<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"au_id") %><br>
</ItemTemplate>
</asp:Repeater>
</form>
</body>
</html>
Visual C# .NET
<%@ Page language="c#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">
void Page_Load(Object sender, EventArgs e)
{
SqlConnection cnn = new
SqlConnection("server=(local);database=pubs;Integrated Security=SSPI");
SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn);
DataSet ds = new DataSet();
da.Fill(ds, "authors");
Repeater1.DataSource = ds.Tables["authors"];
Repeater1.DataBind();
}
</script>
<html>
<body>
<form id="WebForm2" method="post" runat="server">
<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"au_id") %><br>
</ItemTemplate>
</asp:Repeater>
</form>
</body>
</html>
Visual J# .NET
<%@ Page language="VJ#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">
void Page_Load(Object sender, EventArgs e)
{
SqlConnection cnn = new SqlConnection("server=(local);database=pubs;Integrated
Security=SSPI");
SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn);
DataSet ds = new DataSet();
da.Fill(ds, "authors");
DataTableCollection dtc = ds.get_Tables();
int index = dtc.IndexOf("authors");
Repeater1.set_DataSource(dtc.get_Item(index));
Repeater1.DataBind();
}
</script>
<html>
<body>
<form id="WebForm2" method="post" runat="server">
<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"au_id") %><br>
</ItemTemplate>
</asp:Repeater>
</form>
</body>
</html>
有关
Repeater 控件的详细信息,请参阅以下 .NET Framework SDK 文档:
DataList 控件
DataList 类是一个功能丰富、模版、数据绑定列表。您可以通过修改模板来自定义此控件。与
Repeater 控件不同,
DataList 支持定向呈现,并且可以根据需要在运行时呈现到 HTML 表中。
有关
DataList 控件的详细信息,请参阅以下 .NET Framework SDK 文档:
DataGrid 控件
DataGrid 控件是一个功能齐全、多列、数据绑定网格。要自定义
DataGrid 中各列的布局,您可以将列类型设置为“模板”,然后修改列的模板。
DataGrid 控件无需模板即可进行呈现,这使得该控件成了用于报告方案的理想控件。
DataGrid 还支持根据列和根据按钮列进行选择、编辑、删除、分页和排序。
有关
DataGrid 控件的详细信息,请参阅以下 .NET Framework SDK 文档:
访问数据
本部分介绍了如何从数据库访问数据以及将数据绑定到列表控件。您可以使用
DataSet 或
DataReader 类从数据库中获取数据。
DataSet 类
DataSet 包含完整的数据表示,包括表格结构、表格之间的关系,以及数据的顺序。
DataSet 类非常灵活,可以将数据库中任何种类的信息存储到扩展标记语言 (XML) 文件中。
DataSet 类是无状态的;即,您无需连接到服务器连接资源即可将这些类从客户端传递到服务器。以下代码演示了如何使用
DataSet 将数据绑定到控件:
注意:您必须根据环境的需要修改连接字符串的参数。
Visual Basic .NET
Dim cnn As SqlConnection = New SqlConnection("server=(local);" & _
"database=pubs;Integrated Security=SSPI")
Dim cmd As SqlDataAdapter = New SqlDataAdapter("select * from authors", cnn)
Dim ds As DataSet = New DataSet()
cmd.Fill(ds)
MyRepeater.DataSource = ds
MyRepeater.DataBind()
Visual C# .NET
SqlConnection cnn = new SqlConnection("server=(local);
database=pubs;Integrated Security=SSPI");
SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn);
DataSet ds = new DataSet();
da.Fill(ds);
MyRepeater.DataSource = ds;
MyRepeater.DataBind();
Visual J# .NET
SqlConnection cnn = new SqlConnection("server=(local);
database=pubs;Integrated Security=SSPI");
SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn);
DataSet ds = new DataSet();
da.Fill(ds);
MyRepeater.set_DataSource(ds);
MyRepeater.DataBind();
有关
DataSet 类的详细信息,请参阅以下 .NET Framework SDK 文档:
DataReader 类
相反,如果您只需要显示(不更改)要呈现的数据,
DataReader 类可能是一个更好的解决方案。例如,对于
DropDownList 控件,最好使用
DataReader,因为
DataReader 是只进数据游标。以下代码演示了如何使用
SqlDataReader 类将数据绑定到控件:
Visual Basic .NET
Dim cnn As SqlConnection = New SqlConnection("server=(local);" & _
"database=pubs;Integrated Security=SSPI")
Dim cmd As SqlCommand = New SqlCommand("select * from authors", cnn)
cnn.Open()
MyRepeater.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection)
MyRepeater.DataBind()
Visual C# .NET
SqlConnection cnn = new SqlConnection("server=(local);
database=pubs;Integrated Security=SSPI");
SqlCommand cmd = new SqlCommand("select * from authors", cnn);
cnn.Open();
MyRepeater.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection);
MyRepeater.DataBind();
Visual J# .NET
SqlConnection cnn = new SqlConnection("server=(local);
database=pubs;Integrated Security=SSPI");
SqlCommand cmd = new SqlCommand("select * from authors", cnn);
cnn.Open();
MyRepeater.set_DataSource(cmd.ExecuteReader(CommandBehavior.CloseConnection));
MyRepeater.DataBind();
有关
SqlDataReader 类和通过 ASP.NET 进行数据访问的详细信息,请参阅 .NET Framework SDK 文档中的下列主题:
列表控件模版中的绑定
您可以使用列表控件中的模版来绑定和自定义数据源的单个记录。本节提供了三种可用于执行此操作的方法。
DataBinder.Eval 方法
如果数据源与从数据库返回的数据相结合,数据源可能会包含大量信息。您可以使用通用的
DataBinder.Eval 方法返回数据。在以下代码示例中,“au_id”字段是从容器对象的数据源中返回的:
<%# DataBinder.Eval(Container.DataItem,"au_id") %>
有关
DataBinder.Eval 方法的详细信息,请参阅以下 .NET Framework SDK 文档:
显式转换
如果您需要更多控件,请使用显式转换。显式转换使用类型转换关键字。这些关键字充当函数,而由编译器生成内联代码。因此,执行速度要比通过调用函数稍快。下列代码示例使用显式转换:
Visual Basic .NET
' DataTable as the DataSource
<%# CType(Container.DataItem, System.Data.DataRowView)("au_id") %>
' DataReader as the DataSource
<%# CType(Container.DataItem, System.Data.Common.DbDataRecord)("au_id") %>
' DataReader as the DataSource
<%# CType(Container.DataItem, System.Data.Common.DbDataRecord)(0) %>
Visual C# .NET
// DataTable as the DataSource
<%# ((System.Data.DataRowView)Container.DataItem)["au_id"] %>
// DataReader as the DataSource
<%# ((System.Data.Common.DbDataRecord)Container.DataItem)["au_id"] %>
// DataReader as the DataSource
<%# ((System.Data.Common.DbDataRecord)Container.DataItem)[0] %>
Visual J# .NET
// DataTable as the DataSource
<%# ((System.Data.DataRowView)Container.DataItem)["au_id"] %>
// DataReader as the DataSource
<%# ((System.Data.Common.DbDataRecord)Container.DataItem)["au_id"] %>
// DataReader as the DataSource
<%# ((System.Data.Common.DbDataRecord)Container.DataItem)[0] %>
请注意,前面的示例将
DataTable(
DataSet 的子集)或
DataReader 用作数据源。
ItemDataBound 事件
您可以使用控件的
ItemDataBound 事件来绑定数据。当将某个项目的数据绑定到控件时,就会发生该事件。以下 HTML 代码示例使用
ItemTemplate 定义了一个
Repeater 控件:
<asp:repeater id=rptr runat=server>
<itemtemplate>
<asp:label id=lblAuthorID runat=server />
</itemtemplate>
</asp:repeater>
您的页中需要有下列方法:
Visual Basic .NET
public Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
'TODO:Retrieve data from a database,
'and bind the data to a list control.
End Sub
public Sub rptr_OnItemDataBound(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptr.ItemDataBound
Dim rec As DataRowView
rec = e.Item.DataItem
'Make sure that you have the data.
If Not IsDBNull(rec) Then
Dim l1 As Label
l1 = e.Item.FindControl("lblAuthorID")
l1.Text = rec("au_id").ToString()
End If
End Sub
Visual C# .NET
public void Page_Init(object sender, System.EventArgs e)
{
rptr.ItemDataBound += new RepeaterItemEventHandler(rptr_OnItemDataBound);
}
public void Page_Load(object sender, System.EventArgs e)
{
// TODO:Retrieve data from a database,
// and bind the data to a list control.
}
public void rptr_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
System.Data.Common.DbDataRecord rec = (System.Data.Common.DbDataRecord)
e.Item.DataItem;
if(rec!=null) //Make sure that you have the data.
{
Label l1 = (Label)e.Item.FindControl("lblAuthorID");
l1.Text = rec["au_id"].ToString();
}
}
Visual J# .NET
public void Page_Init(Object sender, System.EventArgs e)
{
rptr.add_ItemDataBound(new RepeaterItemEventHandler(rptr_OnItemDataBound));
}
private void Page_Load(Object sender, System.EventArgs e)
{
// TODO:Retrieve data from a database,
// and bind the data to a list control.
}
public void rptr_OnItemDataBound(Object sender, RepeaterItemEventArgs e)
{
System.Data.Common.DbDataRecord rec = (System.Data.Common.DbDataRecord)
e.get_Item().get_DataItem();
if (rec != null) //Make sure that you have the data.
{
Label l1 = (Label)e.get_Item().FindControl("lblAuthorID");
l1.set_Text(((rec.get_Item("au_id")).ToString()));
}
}
有关 ASP.NET 的更多一般性信息,请访问以下 MSDN 新闻组:
microsoft.public.dotnet.framework.aspnet
(http://msdn.microsoft.com/newsgroups/default.aspx?query=microsoft.public.dotnet.framework.aspnet&dg=&cat=en-us-msdn&lang=en&cr=US&pt=&catlist=774F24A2-F71F-425F-AC2B-DC48AB0DA5C9&dglist=&ptlist=&exp=&sloc=en-us)
注意:本篇“快速发布”文章是从 Microsoft 支持组织直接创建的。 文中包含的信息按原样提供,用于响应紧急问题。 由于发布仓促,材料可能包含印刷错误,并且可能随时修订,恕不另行通知。 有关其他注意事项,请参阅
使用条款
(http://go.microsoft.com/fwlink/?LinkId=151500)
。
文章编号: 307860 - 最后修改: 2012年6月29日 - 修订: 1.0
这篇文章中的信息适用于:
- Microsoft ASP.NET 1.0
- Microsoft Visual .NET 2002 标准版
- Microsoft Visual C# .NET 2002 标准版
- Microsoft Visual J# .NET 2003 Standard Edition
- Microsoft ASP.NET 1.1
- Microsoft Visual Basic .NET 2003 标准版
- Microsoft Visual C# .NET 2003 标准版
| kbarttyperoadmap kbdatabinding kbinfo kbservercontrols KB307860 |
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。