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






1.67/5 (2投票s)
创建一个可排序的 GridView 很容易。但是,如果您想对包含字母顺序的列进行非字母顺序排序呢? 答案在下面...
引言
对 GridView
进行常规排序是一个相对简单的过程。但是,对于包含文本(字母顺序)数据的列,但需要以非字母顺序排序,则没有默认机制。包含月份(或其缩写)的列就是一个很好的例子。下面,我们将看到如何做到这一点。
背景
以声明方式实现时,ASP.NET 中的 GridView
排序依赖于基础数据源的排序机制。这意味着 SqlDataSource
将按字母顺序或数字顺序排序。您可以在代码隐藏中以不同的方式对 GridView
进行排序,或者向数据源提供另一列,该列可以按这两种方式之一进行排序。
Using the Code
假设我们有一个表格,用于存储客户服务代表每个月关闭的通话记录数量。 表格设计如下

以下代码创建一个存储过程,该存储过程返回填充 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”列标题,您将看到以下内容

请注意 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)
SqlDataSource
和 GridView
的新代码
<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
进行排序。 您将在奇数次排序尝试中看到以下内容...

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

它现在按月份的数值排序,而不是按月份名称的字母顺序排序。
历史
- 2009 年 4 月 21 日:初始发布
- 2009 年 4 月 22 日:文章更新 - 简化查询