我有一个绑定了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
答案 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
,因为所有示例都提供了)