本文介绍 ASP.NET 数据绑定。

有关其他 ASP.NET 概述,请参阅下面的 Microsoft 知识库文章:
305140 (http://support.microsoft.com/kb/305140/ ) ASP.NET 指南

更多信息

使用 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) 文档:
数据绑定表达式语法
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpcondatabindingexpressionsyntax.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpcondatabindingexpressionsyntax.asp)

Page.DataBind() 与 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/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebUIControlClassDataBindTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebUIControlClassDataBindTopic.asp)

数据绑定列表控件

列表控件是可以绑定到集合的特殊的 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 = 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 文档:
Repeater Web 服务器控件
http://msdn.microsoft.com/library/en-us/cpgenref/html/cpconrepeaterwebservercontrol.asp (http://msdn.microsoft.com/library/en-us/cpgenref/html/cpconrepeaterwebservercontrol.asp)

DataList 控件

DataList 类是一个多功能的、模板化的数据绑定列表。您可以通过修改模板来自定义此控件。与 Repeater 控件不同,DataList 支持定向呈现,并且可以根据需要在运行时呈现到 HTML 表中。

有关 DataList 控件的详细信息,请参阅以下 .NET Framework SDK 文档:
DataList Web 服务器控件
http://msdn.microsoft.com/library/en-us/cpgenref/html/cpcondatalistwebservercontrol.asp (http://msdn.microsoft.com/library/en-us/cpgenref/html/cpcondatalistwebservercontrol.asp)

DataGrid 控件

DataGrid 控件是一个多功能的、多列的数据绑定网格。要自定义 DataGrid 中各列的布局,您可以将列类型设置为"模板",然后修改列的模板。DataGrid 控件无需模板即可进行呈现,这使得该控件成了用于报告方案的理想控件。DataGrid 还支持根据列和根据按钮列进行选择、编辑、删除、分页和排序。

有关 DataGrid 控件的详细信息,请参阅以下 .NET Framework SDK 文档:
DataGrid Web 服务器控件
http://msdn.microsoft.com/library/en-us/cpgenref/html/cpcondatagridwebservercontrol.asp (http://msdn.microsoft.com/library/en-us/cpgenref/html/cpcondatagridwebservercontrol.asp)

访问数据

本节介绍如何访问数据库中的数据以及如何将访问的数据绑定到列表控件。您可以使用 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 = 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 文档:
DataSet 类
http://msdn2.microsoft.com/en-us/library/system.data.dataset(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.data.dataset(vs.71).aspx)

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 文档中的下列主题:
SqlDataReader 类
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataSqlClientSqlDataReaderClassTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataSqlClientSqlDataReaderClassTopic.asp)

开发高性能 ASP.NET 应用程序
http://msdn2.microsoft.com/en-us/library/5dws599a(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/5dws599a(vs.71).aspx)

列表控件模板中的绑定

您可以使用列表控件中的模板来绑定和自定义数据源的各个记录。本节提供了三种可用于执行此操作的方法。

DataBinder.Eval 方法

当数据源处理从数据库返回的数据时,它可能包含很多份信息。您可以使用通用的 DataBinder.Eval 方法返回数据。在以下代码示例中,"au_id"字段是从容器对象的数据源中返回的:
<%# DataBinder.Eval(Container.DataItem,"au_id") %>
                                
有关 DataBinder.Eval 方法的详细信息,请参阅以下 .NET Framework SDK 文档:
DataBinder.Eval 方法
http://msdn.microsoft.com/library/default.asp?url=/library/en-us /cpref/html/frlrfSystemWebUIDataBinderClassEvalTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebUIDataBinderClassEvalTopic.asp)

显式转换

如果您需要更多控件,可使用显式转换。显式转换使用类型转换关键字。这些关键字充当函数,而由编译器生成内联代码。因此,执行速度要比通过调用函数稍快。下列代码示例使用显式转换:

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 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 (ht...

有关 ASP.NET 的更多一般性信息,请访问以下 MSDN 新闻组:
microsoft.public.dotnet.framework.aspnet (http://go.microsoft.com/fwlink/?linkid=5811&clcid=0x409)
posted on 2009-07-27 12:16  vibratea  阅读(259)  评论(0编辑  收藏  举报