Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 排序后如何重新分配ObjectDataSource的DataSource?_.net_Linq_Objectdatasource - Fatal编程技术网

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

.net 排序后如何重新分配ObjectDataSource的DataSource?,.net,linq,objectdatasource,.net,Linq,Objectdatasource,我有一个绑定了ObjectDataSource的Gridview,我正在对列进行排序。在排序事件中,我调用以下命令: e.Cancel = True Me.ods.Select() Me.gv.DataBind() 一切都很好。现在在ODS_Selected事件中,我使用LINQ OrderBy语句操作返回的列表集合。问题在于OrderBy语句不直接修改集合中的元素,而是将结果作为IEnumerable返回 仍然没什么大不了的,我想我可以只获取查询结果,该结果中的项目顺序正确,然后重新分配引用

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

e.Cancel = True
Me.ods.Select()
Me.gv.DataBind()
一切都很好。现在在ODS_Selected事件中,我使用LINQ OrderBy语句操作返回的列表集合。问题在于OrderBy语句不直接修改集合中的元素,而是将结果作为IEnumerable返回

仍然没什么大不了的,我想我可以只获取查询结果,该结果中的项目顺序正确,然后重新分配引用的return集合一个新变量,然后就可以完成了。它不起作用-排序起作用,但数据源操作不起作用,而且视觉上什么也没有发生-没有变化

如果我使用LINQ排序,那么整个过程都会完美工作,因为.Sort直接处理集合中的项。但是,我使用反射来反映排序表达式,因为使用并绑定了实例属性的子级,这使得排序不那么直接。基于这里的帮助,我完成了所有排序工作,因此我无法使用.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)
…并尝试:

MyData = query.ToList()
MyData.Clear()
MyData.AddRange(query)
最后一个将清除集合,.AddRange不会在:Count=0中加载任何内容,即使查询结果中有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
好的,这确实有效。重新赋值一个新变量,然后将其重新添加到中,这样做可以完成我想做的事情:

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,因为所有示例都提供了

,问题可能是您的自定义类。您可能需要使用DataView。你可以在这里查看,告诉我们更多关于MyCustomClass的信息可能会让其他人帮助你。我们真的不知道你的自定义类是什么。不,我想你错过了整个交易。T的列表将绑定得非常好。已经做了很多年了,实际上比DataView IMO更好,因为它是强类型的,还有50个其他原因。我使用.OrderBy操作我的集合,只需要弄清楚如何使用结果管理底层数据源。