我有一个绑定了 ObjectDataSource 的 Gridview,我正在对列进行排序。如果Sorting
我调用以下内容:
e.Cancel = True
Me.ods.Select()
Me.gv.DataBind()
一切皆好。现在ODS_Selected
,我使用 LINQOrderBy
语句操作返回的列表集合。问题是该OrderBy
语句不直接修改集合中的元素并将结果作为 IEnumerable 返回。
仍然没什么大不了的,我想我可以只获取查询的结果(其中项目的顺序正确)并重新分配引用的返回集合(现在是一个新变量)并完成。它不起作用(排序确实起作用,但数据源操作不起作用)并且视觉上没有任何反应 - 没有变化。
如果我使用 LINQ Sort
,则整个过程可以完美运行,因为 a.Sort
直接操作集合中的项目。但是,我使用反射来反映排序表达式,因为使用和绑定了实例属性的子级,这使得排序不那么直接。基于来自这里的帮助(如何使用 LINQ 或 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,即使结果中有 9 个query
结果。
关于如何操作该引用类型MyData
以将其加载或重新分配已订购的结果的任何想法?
谢谢!
编辑:也试过了,绑定的 Gridview 的数据没有任何反应。重新分配后的集合是完美的,但没有任何反应。只有当我.Sort
在集合上使用 a 来测试非子实例属性时,它才能按我的意愿工作。.`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