Пользовательская сортировка DataGridView в WinForm - PullRequest
3 голосов
/ 18 августа 2010

Мой элемент управления DataGridView в настоящее время сортирует, используя свойство Sort связанных данных, но он не выполняет то, что мне нужно.

У меня есть столбец с именем Employee, который отображается как «Имя».Фамилия ".

Когда я сортирую по Employee, Amy Z_Lastname указывается перед John A_Lastname, что означает, что я бы предпочел сортировать по фамилиям.

I может прерватьстрока Employee разбита на 3 части, включая те, которые содержатся в DataTable, и установите для сортировки значение «Фамилия, Имя», а затем скройте столбцы «Фамилия» и «Имя».

Я бы скорее выучитькак переопределить IComparer по умолчанию (или что-то еще, что он использует), чтобы предоставить инструкции о том, как сортировать, как я хочу (ответ, который я предпочел бы).

1 Ответ

3 голосов
/ 18 августа 2010

Пользовательская сортировка в DataGridView

Конечно, DataGridView ничего не знает об этом ранжировании.Сценарий сортировки по умолчанию (автоматическая сортировка для столбца с привязкой к данным) при вызове DataGridView.Sort () с помощью щелчка мыши заголовка столбца просто делегирует реализацию IBindList ApplySort () в списке, который вы привязали к сетке.Обычно этот список будет DataView.Используя мою реализацию ObjectListView, это будет представление списка произвольных бизнес-объектов.В любом случае вы в конечном итоге сравниваете свойства элементов в списке, используя реализацию IComparable типа свойства.

Подробности

Свойство PropertyComparers предоставляет PropertyComparersCollection,это словарь ключей имени свойства и значений IComparer.Вы можете заменить IComparer для свойства, используя метод PropertyComparersCollection.Add () или индексатор (например, view.PropertyComparers ["PropName"] = myComparer).Чтобы вернуться к сортировке IComparable по умолчанию, используйте метод PropertyComparersCollection.Remove () или задайте для значения IComparer значение null через индексатор.

Если IComparer добавлен в коллекцию PropertyComparers, он будет использоваться для всех последующихсортирует, пока не будет удален из коллекции или заменен другим IComparer.Если ObjectListView уже отсортирован, когда IComparer добавлен или удален из PropertyComparers, представление будет автоматически пересортировано.

Если вы хотите изменить несколько компараторов свойств после сортировки представления, вы можете использоватьМетоды ObjectListView BeginUpdate () и EndUpdate () для подавления событий ListChanged и Sort до тех пор, пока не будут изменены все IComparers.Это предотвращает многократное обновление DataGridView.Если ObjectListView не сортируется во время добавления или удаления IComparers, автоматическая повторная сортировка не выполняется.

Обратите внимание, что при сортировке по нескольким столбцам пользовательский IComparer может использоваться с одним свойством сортировки, исортировка по умолчанию IComparable на другом.

например:

private void radioButtonSortProgram_CheckedChanged(object sender, EventArgs e)

{

    if (this.radioButtonSortProgramAlpha.Checked)

        this.view.PropertyComparers["Program"] = new CustomerProgramComparerAlpha();

    else if (this.radioButtonSortProgramRank.Checked)

        this.view.PropertyComparers["Program"] = new CustomerProgramComparerRank();

    else

        this.view.PropertyComparers.Remove("Program");

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