高级分页/排序
GridView 控件中的选择纯粹是一个 UI 概念,其中 SelectedIndex 属性对应于网格的可见行中当前选定的行的索引。如果在网格中启用了分页和排序,网格的 SelectedIndex 将在分页或排序操作之后保持不变,以便在这些操作之后最终将选定新行。在某些情况下,最好保留给定行的选择,即使是在该行目前在网格的当前页上不可见的时候也如此。下面的示例演示一种用于跨排序或分页操作保留选定行的技术。
C# Maintaining Selection After Sort
GridView 和 DetailsView 支持一种特殊的分页和排序模式,它利用客户端到服务器的回调获得新页的数据或新排序的数据。若要启用此功能,请将 EnableSortingAndPagingCallbacks 属性设置为 true。注意,执行分页或排序操作时,不需要回发该页就能检索新值(不过进行了到服务器的客户端脚本回调)。当 GridView 或 DetailsView 包含模板化字段时,此功能不受支持。当启用了此功能时,也不支持在 CommandField 中显示“Select”(选择)按钮。
C# Sorting and Paging Using Callbacks
虽然 GridView、DetailsView 和 FormView 提供页导航 UI 的默认呈现,但是也可以通过设置 PagerTemplate 属性自定义页导航的呈现。在该模板中,您可以放置 CommandName 属性设置为 Page 并且 CommandArgument 属性设置为 First、Prev、 Next、Last 或 <number>(其中 <number> 是特定页索引的值)的 Button 控件。下面的示例演示为 GridView 和 DetailsView 控件定义的 PagerTemplate。
C# Pager Template
代码中的数据绑定
正如在 模板中的数据绑定 小节中所讨论的,ASP.NET 提供了一种声明性数据绑定语法,用于将数据源字段与数据绑定模板中的控件的属性相关联。还可以在代码中使用 <%# ... > 语法对任意值进行数据绑定,例如页和控件属性、集合、表达式,甚至是从方法调用返回的结果。若要强制数据绑定进行计算,必须调用包含数据绑定表达式的页或控件上的 DataBind 方法。下表显示 ASP.NET 中的数据绑定语法的一些示例。
简单属性 客户:<%# custID %>
集合 订单:<asp:ListBox id="List1" datasource='<%# myArray %>' runat="server">
表达式 合同:<%# ( customer.FirstName + " " + customer.LastName ) %>
方法结果: 未结余额:<%# GetBalance(custID) %>
虽然该语法看起来与 Response.Write 的 ASP 快捷方式 <%= %> 相似,但其行为却大不相同。ASP Response.Write 快捷方式语法在页被处理时计算,而 ASP.NET 数据绑定语法仅在 DataBind 方法被调用时计算。
DataBind 是 Page 和所有服务器控件的一个方法。当在父控件上调用 DataBind 时,它级联到该控件的所有子控件。例如 DataList1.DataBind() 将调用 DataList 模板中的每个控件上的 DataBind 方法。调用 Page 上的 DataBind -- Page.DataBind() 或者只是 DataBind() -- 将导致对该页上的所有数据绑定表达式进行计算。DataBind 通常在 Page_Load 事件中被调用,如下面的示例所示。
C# VB
protected void Page_Load(Object Src, EventArgs E) {
DataBind();
}
Protected Sub Page_Load(Src As Object, E As EventArgs)
DataBind()
End Sub
几乎可以在 .aspx 页的声明性部分中的任何位置使用绑定表达式,只要该表达式在运行时计算为预期的数据类型。上面的简单属性、表达式和方法示例在计算时向用户显示文本。在这些情况下,数据绑定表达式必须计算为 String 类型的值。在集合示例中,数据绑定表达式计算为 ListBox 的 DataSource 属性的有效类型值。您可能发现有必要在绑定表达式中强制值的类型以产生所需的结果。例如,如果 count 是一个整数:
Number of Records: <%# count.ToString() %>
ASP.NET 数据绑定语法支持绑定到公共变量、Page 的属性和页上其他控件的属性。下面的示例演示如何绑定到公共变量和页上的简单属性。注意这些值在调用 DataBind() 之前进行初始化。
C# Data Binding to a Property on the Page
下面的示例演示如何绑定到另一个控件的属性。
C# Data Binding to a Server Control Property
诸如 DropDownList、ListBox 和 HTMLSelect 之类的列表服务器控件使用集合作为数据源。下面的示例演示如何绑定到常用的公共语言运行库集合类型。这些控件只能绑定到支持 IEnumerable、ICollection 或 IListSource 接口的集合。最常见的是绑定到 ArrayList、Hashtable、DataView 和 DataReader。下面的示例演示如何绑定到 ArrayList。
C# Data Binding DropDownList
下面的示例演示如何绑定到 DataView。注意 DataView 类是在 System.Data 命名空间中定义的。
C# Data Binding to a DataView
下面的示例演示如何绑定到 Hashtable。
C# Data Binding to a Hashtable
通常需要在绑定到页或控件之前操作数据。下面的示例演示如何绑定到表达式和方法的返回值。
C# Databinding to Methods and Expressions
ASP.NET 页框架提供一个静态方法,计算后期绑定的数据绑定表达式并可选择将结果格式化为字符串。DataBinder.Eval 的便利之处在于它消除了开发人员为了将值强制为所需数据类型所必须做的许多显式强制转换。当数据绑定控件在模板化的列表中时,它特别有用,因为通常数据行和数据字段的类型都必须转换。
请考虑下面的示例,其中一个整数将被显示为货币字符串。使用标准的 ASP.NET 数据绑定语法,必须先强制转换数据行的类型才能检索数据字段 IntegerValue。接着,该值作为参数被传递给 String.Format 方法。
C# VB
<%# String.Format("{0:c}", ((DataRowView)Container.DataItem)["IntegerValue"]) %>
<%# String.Format("{0:c}", (CType(Container.DataItem, DataRowView)("IntegerValue"))) %>
此语法可能很复杂,难于记忆。相反,DataBinder.Eval 只是一个具有三个参数的方法:数据项的命名容器、数据字段名称和格式字符串。在诸如 FormView、GridView、DetailsView、DataList 或 Repeater 这样的模板化控件中,命名容器始终为 Container.DataItem。Page 是可用于 DataBinder.Eval 的另一个命名容器。正如在前一小节中所讨论的,ASP.NET 2.0 还包含 DataBinder.Eval 的新的简化语法(仅仅是 Eval),可以在数据绑定控件模板中使用它来自动解析为 Container.DataItem。有关简化的 Eval 语法的讨论请参见前一小节“模板中的数据绑定”。
C# VB
<%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %>
<%# Eval("IntegerValue", "{0:c}") %>
<%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %>
<%# Eval("IntegerValue", "{0:c}") %>
格式字符串参数是可选的。如果省略它,则 DataBinder.Eval 返回一个对象类型的值,如下面的示例所示。
C# VB
<%# (bool)DataBinder.Eval(Container.DataItem, "BoolValue") %>
<%# CType(DataBinder.Eval(Container.DataItem, "BoolValue"), Boolean) %>
要重点注意的是,相对于标准数据绑定语法,DataBinder.Eval 可能导致显著的性能损失,因为它使用后期绑定反射。使用 DataBinder.Eval 时需谨慎,尤其是在不需要字符串格式设置的时候。
C# Data Binding Using DataBinder.Eval