对 GridView Web 服务器控件中的数据进行排序

更新:2007 年 11 月

GridView 控件提供了内置排序功能,无需任何编码。您可以通过为列设置自定义 SortExpression 属性值并使用 SortingSorted 事件,进一步自定义 GridView 控件的排序功能。

GridView 控件的排序原理

GridView 控件不自己执行列排序,而是依赖数据源控件来代表它执行排序。该控件提供用于排序的用户界面 (UI),如显示在网格每一列最上方的 LinkButton 控件。但是,GridView 控件依赖于它所绑定到的数据源控件的数据排序功能。

如果绑定的数据源控件可以排序数据,则选择数据后,GridView 控件可以通过将 SortExpression 传递给数据源与该数据源控件进行交互并请求排序后的数据。不是所有的数据源控件都支持排序;例如,XmlDataSource 控件就不支持排序。但如果数据源控件支持排序,GridView 就可以利用它。下面的列表描述了数据源控件和支持排序所需的配置:

GridView 的排序过程

通过将 GridView 控件的 AllowSorting 属性设置为 true,即可启用该控件中的默认排序行为。将此属性设置为 true 会使 GridView 控件将 LinkButton 控件呈现在列标题中。此外,该控件还将每一列的 SortExpression 属性隐式设置为它所绑定到的数据字段的名称。例如,如果网格所包含的一列显示的是 Northwind 示例数据库中“Employees”表的 City 列,则该列的 SortExpression 属性将被设置为 City

在运行时,用户可以单击某列标题中的 LinkButton 控件按该列排序。单击该链接会使页面执行回发并引发 GridView 控件的 Sorting 事件。排序表达式(默认情况下是数据列的名称)作为事件参数的一部分传递。Sorting 事件的默认行为是 GridView 控件将排序表达式传递给数据源控件。数据源控件执行其选择查询或方法,其中包括由网格传递的排序参数。

执行完查询后,将引发网格的 Sorted 事件。此事件使您可以执行查询后逻辑,如显示一条状态消息等。最后,数据源控件将 GridView 控件重新绑定到已重新排序的查询的结果。

GridView 控件不检查数据源控件是否支持排序;在任何情况下它都会将排序表达式传递给数据源。如果数据源控件不支持排序并且由 GridView 控件执行排序操作,则 GridView 控件会引发 NotSupportedException 异常。可以用 Sorting 事件的处理程序捕获此异常,并检查数据源以确定数据源是否支持排序,还是使用自己的排序逻辑进行排序。

控制对个别列的排序

通过设置网格的 AllowSorting 属性,您可以按默认方式对列进行排序。通过将个别列的 SortExpression 属性设置为空字符串 (""),可以禁用对个别字段(如 BoundFieldTemplateField 字段)的排序。

自定义排序

如果默认排序行为无法满足您的需要,您可以自定义网格的排序行为。自定义排序的基本技术是处理 Sorting 事件。在处理程序中,可以执行下面的操作:

  • 自定义传递给数据源控件的排序表达式。默认情况下,排序表达式是单个列的名称。您可以在事件处理程序中修改排序表达式。例如,如果要按两列排序,可以创建一个包含这两个列名称的排序表达式。然后,将修改过的排序表达式传递给数据源控件。有关更多信息,请参见 GridViewSortEventArgs.SortExpression 属性。

  • 创建您自己的排序逻辑。例如,如果您使用的数据源不支持排序,则可以用您自己的代码执行排序,然后将网格绑定到排序后的数据。

请参见

概念

ASP.NET 数据绑定 Web 服务器控件概述