ObjectDataSourceがバインドされたGridviewがあり、列の並べ替えを行っています。私が次のSorting
ように呼ぶ場合:
e.Cancel = True
Me.ods.Select()
Me.gv.DataBind()
すべてが順調。ODS_Selected
イベントでは、LINQOrderBy
ステートメントを使用して返されたリストコレクションを操作します。問題は、OrderBy
ステートメントがコレクション内の要素を直接変更せず、結果をIEnumerableとして返すことです。
それでも大したことではありませんが、クエリの結果(適切な順序でアイテムが含まれている)を取得し、参照されたreturnコレクション(現在は新しい変数)を再割り当てして実行できると思いました。それは機能せず(順序付けは機能しますが、データソースの操作は機能しません)、視覚的には何も起こりません-変更はありません。
LINQを使用する場合、はコレクション内のアイテムを直接操作するSort
ため、この手順全体が完全に機能します。.Sort
ただし、インスタンスプロパティの子が使用およびバインドされており、並べ替えがそれほど単純ではないため、Reflectionを使用して並べ替え式を反映しています。ここからのヘルプに基づいて(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)
最後の1つはコレクションをクリアし、.AddRangeは何もロードしません。結果に9つの結果がある場合でも、Count=0query
です。
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