0

我有一个绑定了 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
4

1 回答 1

0

好的,这确实有效。重新评估一个变量,然后将其添加回来就可以了,并完成了我想做的事情:

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

在我的例子中,由于直接在对象上进行排序MyData,我需要将结果放在一个新变量中,因为一旦RemoveRange被调用,两者都query将为MyData空。然后我将排序/排序的项目添加回集合中。同样,MyData是对被绑定的底层数据源的引用。

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

于 2012-05-22T21:31:38.200 回答