你目前正处于脱机状态,正在等待 Internet 重新连接

ASP.NET 数据绑定概述

本文引用下面的 Microsoft .NET Framework 类库命名空间:
  • System.Data
  • System.Data.SqlClient
概要
本文介绍 ASP.NET 数据绑定。

有关其他 ASP.NET 概述,请参阅下面的 Microsoft 知识库文章:
305140 ASP.NET 路线图
更多信息
使用 ASP.NET 数据绑定,您可以将任何服务器控件绑定到简单的属性、集合、表达式和/或方法。如果您使用数据绑定,则当您在数据库中或通过其他方法使用数据时,您会具有更大的灵活性。

本文讨论了下列数据绑定主题:

数据绑定概要

<%# %> 语法

ASP.NET 介绍了一种新的声明性语法 <%# %>。该语法是在 .aspx 页中使用数据绑定的基础。所有数据绑定表达式都必须包含在这些字符中。下面的列表包含从多个源进行简单数据绑定的示例:
  • 简单属性(用于客户的语法):
    <%# custID %>					
  • 集合(用于订单的语法):
    <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.DataBindControl.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

数据绑定列表控件

该列表控件是可以绑定到集合的特殊 Web 服务器控件。您可以使用这些控件以自定义的模板格式显示数据行。所有列表控件都公开 DataSourceDataMember 属性,这些属性用于绑定到集合。

这些控件可以将其 DataSource 属性绑定到支持 IEnumerableICollectionIListSource 接口的任一集合。

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 = dsRepeater1.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;IntegratedSecurity=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 文档:

访问数据

本部分介绍了如何从数据库访问数据以及将数据绑定到列表控件。您可以使用 DataSetDataReader 类从数据库中获取数据。

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 = dsMyRepeater.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] %>				
请注意,前面的示例将 DataTableDataSet 的子集)或 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 Subpublic Sub rptr_OnItemDataBound(ByVal sender As Object, _ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptr.ItemDataBoundDim rec As DataRowViewrec = e.Item.DataItem'Make sure that you have the data.If Not IsDBNull(rec) ThenDim l1 As Labell1 = e.Item.FindControl("lblAuthorID")l1.Text = rec("au_id").ToString()End IfEnd 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()));            }}				
databinding databound
注意:本篇“快速发布”文章是从 Microsoft 支持组织直接创建的。 文中包含的信息按原样提供,用于响应紧急问题。 由于发布仓促,材料可能包含印刷错误,并且可能随时修订,恕不另行通知。 有关其他注意事项,请参阅使用条款
属性

文章 ID:307860 - 上次审阅时间:08/23/2013 14:39:00 - 修订版本: 2.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
反馈