排序后如何重新分配ObjectDataSource的DataSource?

时间:2012-05-22 20:26:47

标签: .net linq objectdatasource

我有一个绑定了ObjectDataSource的Gridview,我正在对列进行排序。在Sorting事件中,我调用以下内容:

e.Cancel = True
Me.ods.Select()
Me.gv.DataBind()

一切都很好。现在在ODS_Selected事件中,我使用LINQ OrderBy语句操作返回的列表集合。问题是OrderBy语句直接在集合中修改元素并将结果作为IEnumerable返回。

仍然没什么大不了的,我想我可以只接受查询的结果(其中包含正确顺序的项目)并重新分配引用的返回集合(现在是一个新变量)并完成。它不起作用(排序确实有效但不是数据源操作)并且没有任何视觉上的结果 - 没有变化。

如果我使用LINQ Sort,则整个过程完美无缺,因为.Sort直接操作集合中的项目。但是我使用Reflection来反映排序表达式,因为实例属性的子项被使用和绑定,这使得排序不那么直接。根据此处的帮助(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

1 个答案:

答案 0 :(得分:0)

确定 工作正常。重新安装一个 new 变量,然后将其添加回来,可以解决问题并完成我想要做的事情:

If query IsNot Nothing Then
   Dim queryTemp = query.ToList()
   MyData.RemoveRange(0, MyData.Count)
   MyData.AddRange(queryTemp)
End If

就我而言,由于直接在MyData对象上进行排序,因此我需要将结果放在一个新变量中,因为一旦RemoveRange被调用,query和{{1}将是空的。然后我将已排序/已订购的商品添加回集合中。同样,MyData是对绑定的基础数据源的引用。

这源于MyData不会更改实际元素顺序的事实 - 它只是按特定顺序读取集合的项目而不更改集合中项目的位置。 .OrderBy实际上会对集合进行排序 - 从而更改集合中项目的位置。但是我无法使用.Sort因为.Sort从自定义方法调用返回的特殊需求来分解实例属性排序表达式(即.OrderBy而不是简单的解决方案排序表达式只是ParentObject.FullName,因为所有示例都提供了)