0

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
4

1 に答える 1

0

OK、これ機能します。新しい変数を再評価してから再度追加すると、トリックが実行され、私がやりたいことが達成されます。

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

私の場合、順序付けはMyDataオブジェクトに対して直接行われたため、結果を新しい変数に配置する必要がありました。これは、一度RemoveRange呼び出されると、両方が空になるためですqueryMyData次に、並べ替え/並べ替えたアイテムをコレクションに追加します。繰り返しMyDataますが、バインドされている基になるデータソースへの参照です。

これは、実際の要素の順序を変更しないという事実に起因し.OrderByます。コレクション内のアイテムの場所を変更せずに、特定の順序でコレクションのアイテムを読み取るだけです。.Sort実際にコレクションを並べ替えます。これにより、コレクション内のアイテムの場所が変更されます。ただし、インスタンスプロパティの並べ替え式を分解するためにカスタムメソッド呼び出しから.Sort返される特殊なニーズのために使用できませんでした(つまり、並べ替え式がすべての例で提供されているような単純なソリューションとは対照的です).OrderByParentObject.FullNameFullName

于 2012-05-22T21:31:38.200 に答える