Установка режимов сортировки для столбцов элемента управления DataGridView в Windows Forms

Столбцы в DataGridView имеют три режима сортировки. Режим сортировки для каждого столбца задается с помощью свойства SortMode столбца, которое может иметь одно из указанных ниже значений перечисления DataGridViewColumnSortMode.

Значение DataGridViewColumnSortMode Description
Automatic Значение по умолчанию для столбцов текстовых полей. Если заголовки столбцов не используются для выбора, при щелчке по заголовку столбца элемент управления DataGridView автоматически сортируется по этому столбцу и отображается глиф, указывающий порядок сортировки.
NotSortable Значение по умолчанию для столбцов, не состоящих из текстовых полей. Такой столбец можно отсортировать программным способом, однако он не предназначен для сортировки, поэтому место для глифа сортировки не зарезервировано.
Programmatic Такой столбец можно отсортировать программным способом, и для глифа сортировки зарезервировано место.

Для столбца, который по умолчанию имеет значение NotSortable, но содержит значения, которые можно осмысленно упорядочить, может потребоваться изменить режим сортировки. Например, если имеется столбец базы данных с числами, представляющими состояния элементов, эти числа можно отобразить в виде соответствующих значков, привязав столбец с изображениями к столбцу базы данных. Затем можно изменить числовые значения ячеек на отображаемые значения изображений в обработчике событий DataGridView.CellFormatting. В этом случае присвоение свойству SortMode значения Automatic позволит пользователям сортировать столбец. Автоматическая сортировка позволит пользователям группировать элементы с одинаковым состоянием, даже если состояния, соответствующие числам, не имеют естественного порядка. Столбцы с флажками — еще один пример ситуации, когда автоматическая сортировка полезна для группирования элементов с одинаковым состоянием.

Вы можете сортировать элемент управления DataGridView по значениям в любом столбце или в нескольких столбцах независимо от значения свойства SortMode. Программная сортировка полезна, если требуется предоставить собственный пользовательский интерфейс для сортировки или реализовать пользовательскую сортировку. Предоставление собственного пользовательского интерфейса сортировки полезно, например, когда вы включаете выбор с помощью заголовков столбцов, задавая режим выбора DataGridView. Хотя в этом случае заголовки столбцов нельзя использовать для сортировки, в них по-прежнему должен отображаться соответствующий глиф сортировки, поэтому свойству SortMode присваивается значение Programmatic.

В столбцах, для которых выбран режим программной сортировки, глиф сортировки не отображается автоматически. Для таких столбцов необходимо отобразить глиф самостоятельно, задав свойство DataGridViewColumnHeaderCell.SortGlyphDirection. Это следует сделать, если требуется гибкая пользовательская сортировка. Например, при сортировке DataGridView по нескольким столбцам может потребоваться отобразить несколько глифов сортировки или не отображать ни одного.

Хотя элемент управления DataGridView можно программно сортировать по любому столбцу, некоторые столбцы, например столбцы кнопок, могут не содержать значений с возможностью осмысленного упорядочения. Для такого столбца значение NotSortable свойства SortMode указывает, что он никогда не будет использоваться для сортировки, поэтому в заголовке нет необходимости резервировать место для глифа сортировки.

При сортировке элемента управления DataGridView можно определить как столбец сортировки, так и порядок сортировки, проверив значения свойств SortedColumn и SortOrder. После пользовательской операции сортировки эти значения бессмысленны. Дополнительные сведения о пользовательской сортировке см. в разделе "Пользовательская сортировка" далее в этой статье.

При сортировке элемента управления DataGridView, содержащего как привязанные, так и непривязанные столбцы, значения в непривязанных столбцах не могут сохраняться автоматически. Чтобы эти значения сохранялись, необходимо реализовать виртуальный режим, присвоив свойству VirtualMode значение true и обрабатывая события CellValueNeeded и CellValuePushed. Дополнительные сведения см. в статье Практическое руководство. Реализация виртуального режима для элемента управления DataGridView в Windows Forms. Сортировка по непривязанным столбцам в режиме привязки не поддерживается.

Программная сортировка

Для программной сортировки элемента управления DataGridView используется его метод Sort.

Перегрузка Sort(DataGridViewColumn,ListSortDirection) метода Sort принимает объект DataGridViewColumn и значение перечисления ListSortDirection в качестве параметров. Эта перегрузка полезна при сортировке по столбцам со значениями, которые могут быть осмысленно упорядочены, но для которых вы не хотите настраивать автоматическую сортировку. Когда вы вызываете эту перегрузку и передаете столбец со значением DataGridViewColumnSortMode.Automatic свойства SortMode, свойства SortedColumn и SortOrder задаются автоматически и в заголовке столбца отображается соответствующий глиф сортировки.

Примечание.

Если элемент управления DataGridView привязан к внешнему источнику данных путем задания свойства DataSource, перегрузка метода Sort(DataGridViewColumn,ListSortDirection) не работает для непривязанных столбцов. Кроме того, если свойство VirtualMode имеет значение true, эту перегрузку можно вызывать только для привязанных столбцов. Чтобы определить, привязан ли столбец к данным, проверьте значение свойства IsDataBound. Сортировка по непривязанным столбцам в режиме привязки не поддерживается.

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

Элемент управления DataGridView можно настроить с помощью перегрузки Sort(IComparer) метода Sort или обработки события SortCompare.

Перегрузка метода Sort(IComparer) принимает в качестве параметра экземпляр класса, реализующего интерфейс IComparer. Эта перегрузка полезна, если требуется предоставить пользовательскую сортировку, например, если значения в столбце не имеют естественного порядка сортировки или если естественный порядок сортировки неуместен. В этом случае нельзя использовать автоматическую сортировку, но по-прежнему может быть необходимо предоставить пользователям возможность сортировать столбцы, щелкая их заголовки. Эту перегрузку можно вызывать в обработчике событий ColumnHeaderMouseClick, если заголовки столбцов не используются для выбора.

Примечание.

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

Чтобы использовать перегрузку метода Sort(IComparer), необходимо создать собственный класс, реализующий интерфейс IComparer. Этот интерфейс требует, чтобы в классе был реализован метод IComparer.Compare, которому DataGridView передает объекты DataGridViewRow в качестве входных данных при вызове перегрузки метода Sort(IComparer). Таким образом можно определить правильный порядок строк на основе значений в любом столбце.

Перегрузка метода Sort(IComparer) не задает свойства SortedColumn и SortOrder, поэтому для отображения глифа сортировки необходимо обязательно задать свойство DataGridViewColumnHeaderCell.SortGlyphDirection.

В качестве альтернативы перегрузке метода Sort(IComparer) пользовательскую сортировку можно обеспечить, реализовав обработчик событий SortCompare. Это событие возникает, когда пользователи щелкают заголовки столбцов, для которых настроена автоматическая сортировка, или при вызове перегрузки Sort(DataGridViewColumn,ListSortDirection) метода Sort. Событие возникает для каждой пары строк в элементе управления, что позволяет определить их правильный порядок.

Примечание.

Событие SortCompare не возникает, когда задано свойство DataSource или когда свойство VirtualMode имеет значение true.

См. также