Сортировка DataGridView

Volik
Дата: 09.07.2014 17:30:27
Добрый день.
Возникли проблемы с пониманием сортировки DataGridView.
Вычитал с msdn следующие вещи:
1) Программная сортировка
"Если элемент управления DataGridView связан с внешним источником данных путем задания свойства DataSource, перегрузка метода Sort(DataGridViewColumn,ListSortDir ection) не работает для несвязанных столбцов. Кроме того, если свойство VirtualMode имеет значение true, вызов этой перегрузки возможен только для связанных столбцов. Определить, является ли столбец связанным, можно исходя из значения свойства IsDataBound. Сортировка несвязанных столбцов в связанном режиме не поддерживается."

2) Пользовательская сортировка
"Перегрузка метода Sort(IComparer) работает, только если элемент управления DataGridView не связан с внешним источником данных, а свойство VirtualMode имеет значение false. Для настройки сортировки для столбцов, связанных с внешним источником данных, следует воспользоваться операциями сортировки, которые поддерживаются этим источником данных. В виртуальном режиме операции сортировки для несвязанных столбцов необходимо обеспечить самостоятельно."

Что имеется: DataGridView, для которой настроен источник данных.
Что нужно: Отсортировать один из столбцов в нужном мне порядке (в ячейках смешанный тип данных, например "строка + число").

Я так понимаю, что поставленную мною цель достичь невозможно, так как моя сортировка относится к пользовательской, но и в то же время есть связь с источником данных?
Как тогда быть?
Cat2
Дата: 09.07.2014 21:10:01
Volik,

Ну почему. Можно все.
Только сортировать надо не DataGridView, а его BindingSource
Типа
BindungSource.Sort=”Field0 Asc, Field1 Desc”

Устанавливаем режим програмастик

Как нарисовать глифы и реагировать на клик по заголовку - творчески переработать пример функции sortButton_Click из

http://msdn.microsoft.com/ru-ru/library/vstudio/ms171608(v=vs.100).aspx
Volik
Дата: 09.07.2014 22:44:22
Cat2,
Только сортировать надо не DataGridView, а его BindingSource
Типа
BindungSource.Sort=”Field0 Asc, Field1 Desc”

Таким способом можно правильно отсортировать столбец, если в нем следующие значения?
1
40
5a
5

Должно получиться:
1
5
5a
40

Но получится:
1
40
5
Volik
Дата: 09.07.2014 22:46:31
Как свою особую сортировку прикрутить таким способом?
HomeCoder
Дата: 10.07.2014 08:05:38
Volik
Как свою особую сортировку прикрутить таким способом?

Разве метод сортировки не принимает какой-нибудь компаратор? А там уже думай, как сортировать числа и буквы. Может, стоит разделить название на числовую и буквенную части и сортировать сначала по числам, а потом по буквам. Название, естественно, выводить без разделения.
Volik
Дата: 10.07.2014 08:17:29
HomeCoder,

BindungSource.Sort - это не метод. Я не знаю, компаратор какого вида он может принимать.

А если Вы про сортировку DataGridView, то у меня инициализирован DataSource, что, КАК Я ПОНЯЛ, делает невозможным сортировку с использованием класса-компаратора в данном случае.
IApple
Дата: 10.07.2014 12:06:20
Volik, если нужен метод, то это ApplySort, но класса-компаратора там нет, а перекрыть его самостоятельно трудновато будет.
Но ведь и BindingSource не содержит коллекции строк для отображения, а только показывает то, на что смотрит DataSource+DataMember...
Это либо коллекция, либо DataTable. Сортируйте этот источник данных самостоятельно своим компаратором или, возможно еще на этапе загрузки данных из БД, исполюзуя ХП в ORDER BY, а BindingSource.Sort оставте в покое.
Volik
Дата: 11.07.2014 08:41:08
IApple,

попробовал сделать вот так
table = table.AsEnumerable().OrderBy(x => x, _columnSorter).CopyToDataTable();
var bindingSource = new BindingSource();
bindingSource.DataSource = table;
this.dataGridView.DataSource = bindingSource;


где _columnSorter - мой класс компаратора.
Сортирует как надо, но к моему гриду прикручен комбобокс с выпадающими фильтрами.
И после сортировки вся фильтрация слетает из-за перепривязки отсортированного источника (без перепривязки не сортируется).

Можно ли как-то избежать данной перепривязки?
Volik
Дата: 11.07.2014 10:40:40
Решил проблему переналожением старого фильтра после перепривязки.
HomeCoder
Дата: 11.07.2014 18:26:09
автор
table = table.AsEnumerable().OrderBy(x => x, _columnSorter).CopyToDataTable();

А нельзя наложить фильтр в вашей цепочке IEnumerable/IQueryable? Уж эти-то интерфейсы принимают в своих методах компараторы в виде делегатов или лямбд.