Сортировка Gridview при переходе с Winforms на ASP.NET 2.0 Webforms - PullRequest
1 голос
/ 04 ноября 2008

У меня проблема с сортировкой 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 просто не могут справиться с тем, что нам нужно сделать (получение данных из нескольких таблиц условно для создания объекта).

Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 05 февраля 2009

Рассматривали ли вы сортировку на стороне клиента?

В прошлом я использовал плагин jquery tablesorter с ASP Gridviews.

http://tablesorter.com/

0 голосов
/ 04 января 2010

В тот год, когда я изначально задавал этот вопрос, мне удалось внедрить новый «стандарт», чтобы коллекции бизнес-объектов теперь были общими списками.

Итак, теперь «класс Collection», который немного больше, чем «Inherits List (Of 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 для запуска событий.

0 голосов
/ 02 января 2010

Вы можете поместить кнопки ссылок с событием On_Click в качестве заголовков каждого столбца.

Когда событие инициируется, выясните, по какому заголовку щелкнули (один метод на заголовок или значение commandArgument). Как только это станет известно, выполните .orderBy или .OrderByDescending для коллекции объектов и поместите результат обратно в качестве источника данных для gridview и привязки данных к нему.

0 голосов
/ 05 ноября 2008

Учитывая, что вы, очевидно, заполняете сетку коллекцией своих собственных объектов, это звучит как идеальная работа для Linq для объектов. С помощью небольшой консистентной смазки вы можете получить то, что фактически является оператором SQL Select для вашей коллекции. Очень классные вещи.

http://www.hookedonlinq.com/LINQtoObjects5MinuteOverview.ashx

Кроме того, вы действительно хотите отсортировать данные в сетке? Если это так, то определенно следует использовать Linq против ваших объектов. Однако редко сортировка содержимого сетки действительно решает проблему («сортировка сетки» обычно приводит к изменению пути доступа к данным, используемым для заполнения сетки.) Приложения браузера не похожи на приложения Windows и не имеют постоянное подключение к базовому источнику данных, чтобы все происходило так же волшебно, как DataGridView в Windows, все выглядит так.

0 голосов
/ 04 ноября 2008

У меня была похожая проблема, и мне нужно было реализовать IComparable на объектах. В основном, чтобы отсортировать коллекцию объектов, вам нужен способ различать их порядок. Интерфейс IComparable имеет один метод, называемый Compare, который позволяет .Net-инфраструктуре определять порядок объектов при их сортировке. Вам нужно реализовать этот метод самостоятельно, чтобы заставить метод сортировки работать.

Результаты Google

Вы не упоминаете сообщение об ошибке, поэтому я не уверен, что это так, вы можете опубликовать сообщение об ошибке?

РЕДАКТИРОВАТЬ:

Что касается вашего комментария; Вы можете реализовать многостолбцовую сортировку, это просто требует больше работы. Вы можете указать поля для сортировки коллекции, а затем использовать эту информацию в методе CompareTo.

Посмотрите на это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...