2012-05-22 2 views
0

ObjectDataSource가 바인딩 된 Gridview가 있고 열을 정렬하고 있습니다. Sorting 이벤트에서 나는 다음을 호출합니다.정렬 후 ObjectDataSource의 DataSource를 재 할당하는 방법은 무엇입니까?

e.Cancel = True 
Me.ods.Select() 
Me.gv.DataBind() 

모두 괜찮습니다. 이제 ODS_Selected 이벤트에서 LINQ OrderBy 문을 사용하여 반환 된 목록 컬렉션을 조작합니다. 문제는 이 아니고이 컬렉션에서 직접 요소를 수정하고 결과를 IEnumerable로 반환하는 OrderBy 문입니다.

아직 큰 문제는 아니지만, 쿼리의 결과 (적절한 순서로 항목이 있음)를 참조하고 참조 된 리턴 콜렉션 (현재는 새로운 변수)을 재 지정하고 완료 할 수 있다고 생각했습니다. 작동하지 않지만 (순서는 작동하지만 데이터 소스 조작은 아님) 아무 것도 시각적으로 발생하지 않으며 변경도 없습니다.

LINQ Sort을 사용하는 경우이 전체 절차는 .Sort이 컬렉션의 항목을 직접 조작하기 때문에 완벽하게 작동합니다. 그러나 인스턴스 속성의 자식 사용 및 바운드 및 그 순전히 정렬 앞으로 정렬 때문에 정렬 식 반영하려면 반사 사용하고 있습니다. 여기 (How do I order a collection based on a child property using LINQ or a Lambda?)의 도움을 바탕으로 모든 정렬 작업이 가능하므로 .OrderBy을 호출하지 않는 한 .Sort을 사용할 수 없습니다. 내가 일한 다음없고, 그들 중 누구도 시도했다

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) 

: 여기

는 ODS_Selected 이벤트에서 코드입니다

MyData = query 

... 그리고 시도 :

MyData = query.ToList() 

.. 시도 :

MyData.Clear() 
MyData.AddRange(query) 

마지막으로 컬렉션을 지우고 query 결과에 9 개의 결과가 있더라도 .AddRange는 다시 아무것도로드하지 않습니다.

참조 유형 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 
+0

문제는 사용자 지정 클래스 일 수 있습니다. DataView를 사용해야 할 수도 있습니다. 여기에서 확인할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.data.dataview.aspx EDIT "MyCustomClass"에 대해 더 자세히 알려주면 다른 사람들이 당신을 도와 줄 수 있습니다. 사용자 정의 클래스가 무엇인지는 알 수 없습니다. – Tony318

+0

아니, 네가 여기서 모든 거래를 놓친 것 같아. List (Of T)는 완벽하게 잘 묶을 것입니다. 강력하게 입력 된 및 기타 50 가지 이유 때문에 수년간 그리고 실제로 DataView IMO보다 더 잘 해왔습니다. .OrderBy를 사용하여 내 컬렉션을 조작하고 결과가있는 기본 데이터 소스를 조작하는 방법을 알아야합니다. – atconway

답변

0

확인이 작업을 수행합니다.가 다시 추가 한 후 새로운 변수를 Reassinging하고하는 트릭을 수행하고 내가 원하는 것을 달성 : 주문하면 MyData 개체에서 직접 수행 된 이후, 내 경우

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

을, 나는 결과를 배치 할 필요 RemoveRange이 호출되면 queryMyData이 모두 비어 있기 때문에 새로운 변수가 비어 있습니다. 그런 다음 정렬/정렬 된 항목을 컬렉션에 다시 추가합니다. 다시 말하자면, MyData은 바인딩되는 기본 데이터 소스에 대한 참조입니다.

이것은 .OrderBy이 실제 요소 순서를 변경하지 않는다는 것을 의미합니다. 컬렉션의 항목 위치를 변경하지 않고 특정 순서로 컬렉션 항목을 읽는 것입니다. .Sort은 컬렉션을 실제로 정렬하므로 컬렉션의 항목 위치가 변경됩니다. 그러나 .Sort.OrderBy 사용자 지정 메서드 호출에서 인스턴스 속성 식 (즉, ParentObject.FullName)을 구분하기 위해 반환 된 특수한 요구 때문에 전체 예제가 제공하는대로 정렬식이 단지 FullName 인 간단한 솔루션과 대조적으로 사용할 수 없습니다.)

관련 문제