【发布时间】:2015-08-08 18:22:54
【问题描述】:
我有一个网格视图,我最近为 rowNo 添加了一个新列
<asp:TemplateField HeaderText="RowNo" ItemStyle-HorizontalAlign="left">
<ItemTemplate>
<asp:Literal ID="lblRowNo" runat="Server"></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
rowNo 应该允许排序功能,就像其他列一样。
我向我的 Order 对象添加了一个属性:
'行号 公共 rowNoVal As Integer 公共属性 rowNo 作为整数 得到 返回行NoVal 结束获取 设置(ByVal 值作为整数) rowNoVal = 值 结束集 结束属性
我在 Data-Bound 事件中设置 rowNo 属性,然后将其分配给 rowNo 项模板:
e.Row.DataItem.rowNo = e.Row.RowIndex + 1
DirectCast(e.Row.FindControl("lblRowNo"), Literal).Text =
e.Row.DataItem.rowNo
这按 rowNo (asc) 显示:
RowNo Created
1 5/29/2015 9:00:20 AM
2 5/29/2015 9:30:48 AM
3 5/29/2015 9:33:04 AM
4 5/29/2015 9:39:05 AM
5 5/29/2015 10:20:21 AM
6 5/29/2015 11:29:25 AM
7 5/29/2015 11:52:20 AM
按rowNo (desc):
RowNo Created
1 5/29/2015 11:52:20 AM
3 5/29/2015 10:20:21 AM
2 5/29/2015 11:29:25 AM
4 5/29/2015 9:39:05 AM
5 5/29/2015 9:33:04 AM
6 5/29/2015 9:30:48 AM
7 5/29/2015 9:00:20 AM
订单正在通过排序事件重新排序,但行号始终保持升序。
感谢您的帮助。
更新解决方案
-
添加了 j.f. 的循环。发布到 GetOrders() 方法。
Dim i As Integer i = 1 For Each order As Order In orderList.Items order.rowNo = i i += 1 Next Me.gdvHeaders.Visible = True Me.gdvHeaders.DataSource = orderList.Items Me.gdvHeaders.DataBind() -
从网格视图的数据绑定事件中删除了 rowNo 的增量和赋值:
'Add rowNo e.Row.DataItem.rowNo = e.Row.RowIndex + 1 DirectCast(e.Row.FindControl("lblRowNo"), Literal).Text = e.Row.DataItem.rowNo -
将 #2 替换为:
DirectCast(e.Row.FindControl("lblRowNo"), Literal).Text = e.Row.DataItem.rowNo
现在我可以使用 rowNo 列对 ASC|DESC 进行排序。
非常感谢 j.f.为解决我的问题而提供的帮助和耐心。
【问题讨论】:
-
在将数据绑定到 GridView 之前,是否可以在数据源中为行号添加一个新列?或者,如果您正在查询数据库,请将行号添加到查询中?然后像任何其他列一样使用行号。
-
我不是在查询数据库,代码调用了一个服务,我不能修改服务层的代码,很遗憾。关于您的第一个建议,如何在数据源中为行号添加新列?
-
我最初的想法是,如果您使用的是 DataTable,您可以简单地添加另一列。但是,我看到您正在使用 Order 对象列表。我想向您的 Order 对象添加行号或 ID 属性可能没有完全意义。不过那也行。另一种可能性是使用字典作为您的数据源。键可以用作行号。然而,这可能需要重新设计您的 GridView。
-
确保将行号添加到绑定到 GridView 的实际订单对象中。您现在正在做的是创建一个全新的订单,添加行号,然后设置文本。实际订单对象的行号属性从未设置。
-
谢谢。我该怎么做?我添加了新订单,因为我不确定如何访问该属性。
标签: asp.net .net vb.net sorting gridview