У меня проблема с сортировкой Gridview, которая похожа на другие, но я привязываюсь к объекту коллекции, а не к таблице данных.
Существующие бизнес-правила и уровни доступа к данным приложения следуют шаблону наличия объекта и, если вам нужна коллекция объектов этого типа, иметь другой класс, наследующий CollectionBase и реализующий IBindingList.
Для настольных приложений было легко привязать представление сетки к одному из этих объектов, и не было никаких проблем с включением сортировки по столбцам. На уровне представления настольного приложения все было «в состоянии».
Теперь этот код перемещается в новое веб-приложение (страницы с выделенным кодом ASP.NET 2.0, VB).
Я поигрался с тем, что мне нужно было сделать, чтобы в сетке отображались только определенные столбцы коллекции, а сетка выглядела довольно хорошо. Когда я включил «разрешить сортировку», тогда и обнаружились проблемы.
Я получаю сообщение об отсутствии метода .Sorting и т. д. Исследуя это, я обнаружил всевозможные решения, которые легко реализовать с помощью dataviews если, моим источником была таблица данных. Но это не так - это сборник. Я попытался "дешево выстрелить" в источник данных, преобразовав коллекцию в поток памяти XML, и они попытались .ReadXML обратно в набор данных, но это не сработало [Корневой элемент отсутствует ошибка была настолько далеко, насколько я получил в наборе данных. ReadXml (ioTemp), где ioTemp был System.IO.MemoryStream, используемым в сериализаторе xml].
Из-за старых настольных приложений мне никогда не приходилось беспокоиться о сортировке коллекции, поскольку gridview обрабатывает ее после загрузки. Фактически, это «стандарт», что .SortProperty, .SortDirection и .ApplySort коллекции проходят через NotSupportedExceptions (я унаследовал этот код от давно ушедших программистов).
Есть ли простой способ преобразовать коллекцию в таблицу данных или способ отсортировать коллекцию без необходимости каждый раз возвращаться к базе данных? Источники объектных данных не будут работать из-за сложных правил построения объектов - мастера в VS2005 просто не могут справиться с тем, что нам нужно сделать (условно захватывая данные из нескольких таблиц для создания объекта).
Заранее спасибо.





У меня была аналогичная проблема, и мне нужно было реализовать IComparable для объектов. В основном, чтобы отсортировать коллекцию объектов, вам нужен способ различать их порядок. Интерфейс IComparable имеет один метод под названием Compare, который позволяет платформе .Net определять порядок объектов при их сортировке. Вам необходимо реализовать этот метод самостоятельно, чтобы метод сортировки работал.
Вы не упоминаете сообщение об ошибке, поэтому я не могу быть уверен, что это так, вы можете опубликовать сообщение об ошибке?
РЕДАКТИРОВАТЬ :
Что касается вашего комментария; вы можете реализовать сортировку по нескольким столбцам, это просто требует больше работы. Вы можете указать поля для сортировки коллекции, а затем использовать эту информацию в методе CompareTo.
Вы так думаете, но, к сожалению, я думаю, что Кайус прав. Я постараюсь взглянуть на один из моих проектов завтра.
Учитывая, что вы, по-видимому, заполняете сетку коллекцией собственных объектов, это звучит как идеальная работа для Linq for Objects. С помощью небольшой смазки вы можете добиться того, что по сути является оператором SQL Select для вашей коллекции. Очень классная штука.
http://www.hookedonlinq.com/LINQtoObjects5MinuteOverview.ashx
Кроме того, вы действительно хотите просто отсортировать данные в сетке? Если да, то определенно продолжу использовать Linq против ваших объектов. Однако сортировка содержимого сетки редко действительно решает проблему («сортировка сетки» обычно означает изменение пути доступа к данным, используемым для заполнения сетки.) Браузерные приложения не похожи на приложения Windows и не имеют постоянное подключение к базовому источнику данных, чтобы все происходило так же волшебно, как кажется, DataGridView в Windows.
Возможно, я смогу использовать этот вызов, чтобы убедить сильных мира сего, что мы должны быть «более современными», чем ASP.NET 2.0. К сожалению, это государственная установка.
Рассматривали ли вы вместо этого сортировку на стороне клиента?
Раньше я использовал плагин jquery tablesorter с ASP Gridviews.
Я просто использовал скрипт tableorter, и он отлично сработал. Это сценарий 19k. Мне пришлось добавить код в событие RowDataBound, чтобы оно заработало.
Вы можете поместить кнопки ссылок с событием On_Click в качестве заголовка каждого столбца.
Когда событие запускается, выясните, какой заголовок был нажат (один метод для каждого заголовка или значение commandArgument). Как только это будет известно, выполните .orderBy или .OrderByDescending by для коллекции объектов и верните результат в качестве источника данных для gridview и привязки данных к нему.
За год, прошедший с того момента, как я впервые задал этот вопрос, мне удалось реализовать новый «стандарт», так что коллекции бизнес-объектов теперь были общими списками.
Итак, теперь «класс коллекции», который представляет собой немного больше, чем «список наследований (MyBusinessObject)» с методом сортировки, который выглядит следующим образом (производительность не была проблемой):
Public Overloads Sub Sort(ByVal strPropertyName As String, ByVal strDirection As String)
Dim arSortedList As New ArrayList
For Each item As MyBusinessObject In Me
arSortedList.Add(item)
Next
arSortedList.Sort(New CaseInsensitiveComparer(Of MyBusinessObject)(strPropertyName, strDirection))
For intI As Integer = 0 To arSortedList.Count - 1
Item(intI) = arSortedList(intI)
Next
End Sub
Казалось, что это отлично работает с методологией, используемой GridView для запуска событий.
ICompare был бы хорош для простой сортировки, но этот случай предназначен для сортировки по любому столбцу, который они нажимают в сетке. ДОЛЖЕН быть простой способ отсортировать сетку, которая уже отображается на экране ...