这是GridView:
<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
等的常见模式,例如:allow sorting by column gridview
那么我该如何处理“特殊”排序代码?
更新:为了清楚起见,我可以根据需要滚动自己的函数来比较两个字符串。但是,我不知道如何将该函数应用于我的数据网格/数据源。
答案 0 :(得分:1)
您可以为DataGridView.Sort实现IComparer类:
http://msdn.microsoft.com/en-us/library/wstxtkxs%28v=vs.85%29.aspx
您可以在比较方法中分离“T”和以下数字。
答案 1 :(得分:0)
GridView
允许DataKeyNames
,这就是解决方案。设置数据源(在我的情况下,SQL查询)包括“FullId”和“PlainId”,它已经剥离了主角并将余数解析为int。使用“FullId”作为列的文本值,但将“PlainId”设为DataKeyNames
之一,并将其用作列的SortExpression
。