2012-05-22 3 views
0

У меня есть Gridview, у которого есть привязка ObjectDataSource, и я делаю сортировку по столбцам. В мероприятии Sorting я вызываю следующее:Как переназначить DataSource объекта ObjectDataSource после сортировки?

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

Все в порядке. Теперь в событии ODS_Selected я манипулирую возвращаемой коллекцией списков с помощью оператора LINQ OrderBy. Проблема состоит в том, что оператор OrderBy делает не, а непосредственно изменяет элементы в коллекции и возвращает результат в виде IEnumerable.

По-прежнему неважно, я думал, что могу просто взять результат запроса (который имеет элементы в правильном порядке) и переназначить ссылочную коллекцию ссылок (теперь новую переменную) и выполнить. Это не работает (упорядочение работает, но не манипулирует данными), и ничего не происходит визуально - никаких изменений.

Если я использую LINQ Sort, вся эта процедура отлично работает, потому что .Sort непосредственно манипулирует элементами коллекции. Однако я использую Reflection, чтобы отразить выражение сортировки, потому что дети свойств экземпляра используются и связаны, и это делает сортировку не так прямолинейно. На основании справки отсюда (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, чтобы загрузить его или переназначить с результатами, которые были заказаны?

Спасибо!

EDIT: Пробовал это, а также ничего не происходит с данными 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

Нет, я думаю, вы пропустили всю сделку здесь. Список (Of T) будет прекрасно связываться. Делали это в течение многих лет и на самом деле лучше, чем DataView IMO, потому что он строго типизирован и еще 50 причин. Я управляю своей коллекцией с помощью .OrderBy и просто должен выяснить, как манипулировать базовым источником данных с результатами. – atconway

ответ

0

OK это делает работу.Reassinging переменной нового, а затем добавить его обратно в делает трюк и выполняет то, что я хочу сделать:

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, поскольку все примеры предоставляют)