65.9K
CodeProject 正在变化。 阅读更多。
Home

如何对 GridView 列中的文本数据进行非字母顺序排序

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.67/5 (2投票s)

2009年4月21日

CPOL

2分钟阅读

viewsIcon

27272

创建一个可排序的 GridView 很容易。但是,如果您想对包含字母顺序的列进行非字母顺序排序呢? 答案在下面...

引言

GridView 进行常规排序是一个相对简单的过程。但是,对于包含文本(字母顺序)数据的列,但需要以非字母顺序排序,则没有默认机制。包含月份(或其缩写)的列就是一个很好的例子。下面,我们将看到如何做到这一点。

背景

以声明方式实现时,ASP.NET 中的 GridView 排序依赖于基础数据源的排序机制。这意味着 SqlDataSource 将按字母顺序或数字顺序排序。您可以在代码隐藏中以不同的方式对 GridView 进行排序,或者向数据源提供另一列,该列可以按这两种方式之一进行排序。

Using the Code

假设我们有一个表格,用于存储客户服务代表每个月关闭的通话记录数量。 表格设计如下

CustomerService.gif

以下代码创建一个存储过程,该存储过程返回填充 GridView 所需的值

CREATE PROCEDURE CallsByRepAndMonth
AS
SELECT CustomerServiceRep, 
	Convert(char(3), CallDate, 107) AS [Month],
	Count(Month(CallDate)) AS [Calls]
FROM CallHistory
GROUP BY CustomerServiceRep, Convert(char(3), CallDate, 107), 
Month(CallDate)

这是 ASPX 页面中的代码,用于创建一个 SqlDataSource 以返回数据和一个 GridView 以显示它

<asp:SqlDataSource SelectCommand="exec CallsByRepAndMonth"
    ConnectionString="server=localhost; integrated security=true; 
                      initial catalog=CustomerService" 
    runat="server" ID="dsCalls">
<asp:GridView AllowSorting="true" AutoGenerateColumns="true" 
    DataSourceID="dsCalls" runat="server" ID="GVCalls" />

如果您在浏览器中查看此页面并单击“Month”列标题,您将看到以下内容

SortGVSprocNone.gif

请注意 GridView 如何按月份名称按字母顺序排序。您始终可以向下扫描列表,知道在哪里可以找到您要查找的月份名称。但是,如果 GridView 可以自动按代表月份的序数排序,例如,将一月放在第一位,二月放在第二位,那就更好了。

这可以通过在存储过程中返回另一列来轻松完成。新的存储过程如下所示

CREATE PROCEDURE CallsByRepAndMonth_WithNumber
AS
SELECT CustomerServiceRep, 
	Convert(char(3), CallDate, 107) AS [Month],
	Month(CallDate) AS MonthNumber,
	Count(Month(CallDate)) AS [Calls]
FROM CallHistory
GROUP BY CustomerServiceRep, Convert(char(3), CallDate, 107), 
Month(CallDate)

SqlDataSourceGridView 的新代码

<asp:SqlDataSource SelectCommand="exec CallsByRepAndMonth_WithNumber" 
    ConnectionString="server=localhost; integrated security=true; 
                      initial catalog=CustomerService" 
    runat="server" ID="dsCallsWithNumber">
<asp:GridView AllowSorting="true" AutoGenerateColumns="false" 
    DataSourceID="dsCallsWithNumber" runat="server" ID="GVCallsWithNumber">
    <Columns>
      <asp:BoundField SortExpression="CustomerServiceRep" 
      HeaderText="Customer Service Rep" DataField="CustomerServiceRep">
      <asp:BoundField SortExpression="MonthNumber" 
      HeaderText="Month" DataField="Month">
      <asp:BoundField SortExpression="Calls" DataField="Calls" HeaderText="Calls">
    </Columns>

看到 AutoGenerateColumns 属性设置为 false 了吗? 这意味着我们必须指定绑定列。 有三列,就像之前的 GridView 中一样,并且每列都指定了 SortExpression 属性。 第二列显示月份的名称,但请注意,其 SortExpression 设置为 MonthNumber。 这是存储过程返回的月份的数值。 没有 GridView 列绑定到存储过程返回的此字段。 它已包含在存储过程中,仅用于允许对列进行排序。

启动您的浏览器,然后单击“Month”列以对 GridView 进行排序。 您将在奇数次排序尝试中看到以下内容...

SortGVSprocAsc.gif

...以及偶数次排序的结果

SortGVSprocDesc.gif

它现在按月份的数值排序,而不是按月份名称的字母顺序排序。

历史

  • 2009 年 4 月 21 日:初始发布
  • 2009 年 4 月 22 日:文章更新 - 简化查询
© . All rights reserved.