0

这是网格视图:

<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
    }
}

其中“正常”排序代码遵循转换DataSourceDataView和设置DataView.Sort = e.SortExpression等的常见模式,例如:允许按列 gridview 排序

那么对于“特殊”排序代码我该怎么办?

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

4

2 回答 2

1

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

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

您可以在比较方法中将“T”和以下数字分开。

于 2013-01-25T01:43:38.457 回答
0

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

于 2013-01-30T20:13:52.013 回答