【发布时间】:2012-05-22 20:26:47
【问题描述】:
我有一个绑定了 ObjectDataSource 的 Gridview,我正在对列进行排序。在Sorting 事件中,我调用以下内容:
e.Cancel = True
Me.ods.Select()
Me.gv.DataBind()
一切都很好。现在在ODS_Selected 事件中,我使用LINQ OrderBy 语句操作返回的列表集合。问题是OrderBy 语句不直接修改集合中的元素并将结果作为 IEnumerable 返回。
仍然没什么大不了的,我想我可以只获取查询的结果(其中的项目按正确的顺序排列)并重新分配引用的返回集合(现在是一个新变量)并完成。它不起作用(排序确实起作用,但数据源操作不起作用)并且视觉上没有任何反应 - 没有变化。
如果我使用 LINQ Sort,则整个过程可以完美运行,因为 .Sort 直接操作集合中的项目。但是,我使用反射来反映排序表达式,因为使用和绑定了实例属性的子级,这使得排序不那么直接。根据此处 (How do I order a collection based on a child property using LINQ or a Lambda?) 的帮助,我完成了所有排序工作,因此我不能使用 .Sort,除非它是在调用 .OrderBy 之后。
这是来自 ODS_Selected 事件的代码:
Dim MyData As New List(Of MyCustomClass)
'Because objects are Reference types, setting RequestQueueData = e.ReturnValue means they will share the same memory address and any modifications to 'MyData will be reflected in 'e'.
MyData = e.ReturnValue
Dim query As IEnumerable(Of MyCustomClass) = MyData.OrderBy(blah,blah)
我尝试了以下方法,但都没有奏效:
MyData = query
...并尝试过:
MyData = query.ToList()
..并尝试过:
MyData.Clear()
MyData.AddRange(query)
最后一个清除集合,.AddRange 不会重新加载任何内容:Count = 0,即使 query 结果中有 9 个结果。
关于如何操作该引用类型 MyData 以加载它或使用已排序的结果重新分配它的任何想法?
谢谢!
编辑:也试过了,绑定的 Gridview 的数据没有任何反应。重新分配后的集合完美,但没有任何反应。只有当我在集合上使用.Sort 来测试非子实例属性时,它才能按我的意愿工作。 .`OrderBy' 只是不会永久修改该集合,即使重新分配后它看起来很完美:
Dim MyData2 As New List(Of MyCustomClass )
If query IsNot Nothing Then
For Each mc As MyCustomClass In query.ToList()
MyData2 .Add(req)
Next
End If
MyData = New List(Of BLL.Entities.Request)
'After this point, MyData & MyData2 are in the proper order.
MyData = MyData2
【问题讨论】:
-
问题可能是您的自定义类。您可能需要使用 DataView。你可以在这里查看msdn.microsoft.com/en-us/library/system.data.dataview.aspx 编辑告诉我们更多关于“MyCustomClass”的信息可能会让其他人为你提供更多帮助。我们真的不知道您的自定义类是什么。
-
不,我认为您错过了这里的全部交易。 List(Of T) 将完美绑定。多年来一直这样做,实际上比 DataView IMO 更好,因为它是强类型和 50 个其他原因。我使用 .OrderBy 操作我的集合,只需要弄清楚如何使用结果操作底层数据源。
标签: .net linq objectdatasource