У меня есть 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
Проблема может быть в вашем обычном классе. Возможно, вам придется использовать DataView. Вы можете проверить это здесь http://msdn.microsoft.com/en-us/library/system.data.dataview.aspx EDIT Расскажи нам больше о "MyCustomClass", чтобы другие могли вам помочь. Мы действительно не знаем, каков ваш пользовательский класс. – Tony318
Нет, я думаю, вы пропустили всю сделку здесь. Список (Of T) будет прекрасно связываться. Делали это в течение многих лет и на самом деле лучше, чем DataView IMO, потому что он строго типизирован и еще 50 причин. Я управляю своей коллекцией с помощью .OrderBy и просто должен выяснить, как манипулировать базовым источником данных с результатами. – atconway