【问题标题】:How to reassign DataSource of ObjectDataSource after sorting?排序后如何重新分配 ObjectDataSource 的 DataSource?
【发布时间】: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


【解决方案1】:

好的,这确实工作。重新评估一个 new 变量,然后将其重新添加就可以解决问题并完成我想做的事情:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多