使用自定义函数对 asp:GridView 进行排序

本文关键字:GridView 排序 asp 自定义函数 | 更新日期: 2023-09-27 17:56:08

这是网格视图:

<asp:GridView ID="MyGridView" runat="server" AllowPaging="true" AllowSorting="true"
    OnPageIndexChanging="MyGridView_PageIndexChanging"
    OnSorting="MyGridView_Sorting">
    <Columns>
        <asp:TemplateField HeaderText="ID" SortExpression="Id">
            <ItemTemplate>
                <asp:Label ID="idLabel" runat="server" Text='<%# Bind("Id") %>' />
            </ItemTemplate>
       </asp:TemplateField>
    </Columns>
</asp:GridView>

在这里,Id 列是一个字符串,始终由字母"T"后跟一个数字组成,即"T1"或"T597"其他列是相当普通的名称和描述字符串字段。

我需要这个 Id 列进行排序,就好像 Id 是数字一样,忽略前面的字母。 但是因为它在那里,所以它被视为字符串并按以下方式排序:T1、T10、T100、T2、T231、T34、...

所以我认为可能的是:

protected void MyGridView_Sorting(object sender, GridViewSortEventArgs e)
{
    if (e.SortExpression.Equals("Id")
    {
         // Special sorting code
    }
    else
    {
        // Normal sorting code
    }
}

其中"正常"排序代码遵循将DataSource转换为DataView和设置DataView.Sort = e.SortExpression等的常见模式,例如:允许按列网格视图排序

那么我该怎么做才能处理"特殊"排序代码呢?

更新:为了清楚起见,我可以毫不费力地滚动自己的函数来根据需要比较两个字符串。 但是,我不知道如何将该功能应用于我的数据网格/数据源。

使用自定义函数对 asp:GridView 进行排序

您可以为 DataGridView.Sort 实现 IComparer 类:

http://msdn.microsoft.com/en-us/library/wstxtkxs%28v=vs.85%29.aspx

您可以在比较方法中分隔"T"和以下数字。

GridView允许DataKeyNames,这就是这里的解决方案。 设置数据源(在我的例子中是SQL查询)时,包括"FullId"和"PlainId",它们去除了前导字符并将其余部分解析为int。 使用"FullId"作为列的文本值,但将"PlainId"作为DataKeyNames之一,并将其用作列的SortExpression