C datagridview сортировка по столбцу

Формулировка задачи:

Имеется datagridview, в которой имеются некоторые данные, в частности, столбец с порядковым номером 2, в котором содержатся номера квартир. Необходимо сделать сортировку по этому столбцу по возрастанию.

Таблица заполняется программно из множества xml файлов (без всяких datasource, переделывать уже не вариант, т.к. скоро сдавать), тип string. НО есть один файл, в котором номер квартиры – это номер помещения, а он == -I(7-33);I(1-30).

До появления этого самого номера помещения таблица прекрасно сортировалась методом

DataGridViewстолбцы имеют три режима сортировки. DataGridView columns have three sort modes. Режим сортировки для каждого столбца задается с помощью SortMode свойства столбца, для которого можно задать одно из следующих DataGridViewColumnSortMode значений перечисления. The sort mode for each column is specified through the SortMode property of the column, which can be set to one of the following DataGridViewColumnSortMode enumeration values.

Значение DataGridViewColumnSortMode DataGridViewColumnSortMode value Описание Description
Automatic По умолчанию для столбцов текстового поля. Default for text box columns. Если для выделения не используются заголовки столбцов, DataGridView при щелчке заголовка столбца автоматически сортируется по этому столбцу и отображается глиф, указывающий порядок сортировки. Unless column headers are used for selection, clicking the column header automatically sorts the DataGridView by this column and displays a glyph indicating the sort order.
NotSortable По умолчанию для столбцов, не являющихся текстовыми полей. Default for non–text box columns. Этот столбец можно отсортировать программно; Однако он не предназначен для сортировки, поэтому для глифа сортировки не резервируется место. You can sort this column programmatically; however, it is not intended for sorting, so no space is reserved for the sorting glyph.
Programmatic Этот столбец можно отсортировать программно, и для глифа сортировки зарезервировано пространство. You can sort this column programmatically, and space is reserved for the sorting glyph.

Может потребоваться изменить режим сортировки для столбца, который по умолчанию NotSortable имеет значение, если он содержит значения, которые могут быть осмысленно упорядочены. You might want to change the sort mode for a column that defaults to NotSortable if it contains values that can be meaningfully ordered. Например, если имеется столбец базы данных, содержащий числа, представляющие состояния элементов, эти числа можно отобразить в виде соответствующих значков путем привязки столбца Image к столбцу базы данных. For example, if you have a database column containing numbers that represent item states, you can display these numbers as corresponding icons by binding an image column to the database column. Затем числовые значения ячейки можно изменить на отображаемые значения изображения в обработчике DataGridView.CellFormatting события. You can then change the numerical cell values into image display values in a handler for the DataGridView.CellFormatting event. В этом случае, если задать SortMode для Automatic свойства значение, пользователи смогут сортировать столбец. In this case, setting the SortMode property to Automatic will enable your users to sort the column. Автоматическая сортировка позволяет пользователям группировать элементы, имеющие одинаковое состояние, даже если в состояниях, соответствующих числам, нет естественной последовательности. Automatic sorting will enable your users to group items that have the same state even if the states corresponding to the numbers do not have a natural sequence. Столбцы флажков являются еще одним примером, где автоматическая сортировка полезна для группирования элементов в одном и том же состоянии. Check box columns are another example where automatic sorting is useful for grouping items in the same state.

Читайте также:  Как отказаться от подписки приложения на айфон

Можно выполнить сортировку DataGridView программными средствами по значениям в любом столбце или в нескольких столбцах независимо SortMode от параметров. You can sort a DataGridView programmatically by the values in any column or in multiple columns, regardless of the SortMode settings. Программная сортировка полезна, если необходимо предоставить собственный пользовательский интерфейс для сортировки или реализовать пользовательскую сортировку. Programmatic sorting is useful when you want to provide your own user interface (UI) for sorting or when you want to implement custom sorting. Предоставление собственного пользовательского интерфейса сортировки полезно, например, при установке DataGridView режима выделения для включения выбора заголовка столбца. Providing your own sorting UI is useful, for example, when you set the DataGridView selection mode to enable column header selection. В этом случае, несмотря на то, что заголовки столбцов нельзя использовать для сортировки, все равно требуется, чтобы в заголовках отображался соответствующий глиф сортировки, поэтому SortMode необходимо задать Programmaticдля свойства значение. In this case, although the column headers cannot be used for sorting, you still want the headers to display the appropriate sorting glyph, so you would set the SortMode property to Programmatic.

Столбцы, для которых задан режим программной сортировки, не отображают глиф сортировки автоматически. Columns set to programmatic sort mode do not automatically display a sorting glyph. Для этих столбцов необходимо самостоятельно отобразить глиф, задав DataGridViewColumnHeaderCell.SortGlyphDirection свойство. For these columns, you must display the glyph yourself by setting the DataGridViewColumnHeaderCell.SortGlyphDirection property. Это необходимо, если требуется гибкость при пользовательской сортировке. This is necessary if you want flexibility in custom sorting. Например, при сортировке DataGridView по нескольким столбцам может потребоваться отобразить несколько глифов сортировки или без глифа сортировки. For example, if you sort the DataGridView by multiple columns, you might want to display multiple sorting glyphs or no sorting glyph.

Хотя можно программно сортировать DataGridView по любому столбцу, некоторые столбцы, например столбцы кнопок, могут не содержать значений, которые могут быть осмысленно упорядочены. Although you can programmatically sort a DataGridView by any column, some columns, such as button columns, might not contain values that can be meaningfully ordered. Для этих столбцов SortMode NotSortable параметр свойства указывает, что он никогда не будет использоваться для сортировки, поэтому нет необходимости зарезервировать место в заголовке для глифа сортировки. For these columns, a SortMode property setting of NotSortable indicates that it will never be used for sorting, so there is no need to reserve space in the header for the sorting glyph.

При сортировке можно определить как столбец сортировки, так и порядок сортировки, проверив значения SortedColumn свойств и SortOrder. DataGridView When a DataGridView is sorted, you can determine both the sort column and the sort order by checking the values of the SortedColumn and SortOrder properties. Эти значения не имеют смысла после пользовательской операции сортировки. These values are not meaningful after a custom sorting operation. Дополнительные сведения о пользовательской сортировке см. в разделе Настраиваемая сортировка далее в этом разделе. For more information about custom sorting, see the Custom Sorting section later in this topic.

При сортировке DataGridView элемента управления, содержащего как связанные, так и несвязанные столбцы, значения в непривязанных столбцах не могут поддерживаться автоматически. When a DataGridView control containing both bound and unbound columns is sorted, the values in the unbound columns cannot be maintained automatically. Чтобы сохранить эти значения, необходимо реализовать VirtualMode виртуальный режим, задав true свойству значение и обрабатывающее CellValueNeeded события и CellValuePushed . To maintain these values, you must implement virtual mode by setting the VirtualMode property to true and handling the CellValueNeeded and CellValuePushed events. Дополнительные сведения см. в разделе Практическое руководство. Реализуйте виртуальный режим в элементе управленияWindows Forms DataGridView. For more information, see How to: Implement Virtual Mode in the Windows Forms DataGridView Control. Сортировка по несвязанным столбцам в связанном режиме не поддерживается. Sorting by unbound columns in bound mode is not supported.

Читайте также:  Как включить адресную строку в яндекс браузере

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

Можно выполнить сортировку DataGridView программным путем, Sort вызвав его метод. You can sort a DataGridView programmatically by calling its Sort method.

Sort(DataGridViewColumn,ListSortDirection) Перегрузка Sort методапринимаетDataGridViewColumn в качестве параметров значение и перечисления.ListSortDirection The Sort(DataGridViewColumn,ListSortDirection) overload of the Sort method takes a DataGridViewColumn and a ListSortDirection enumeration value as parameters. Эта перегрузка полезна при сортировке по столбцам со значениями, которые могут быть осмысленно упорядочены, но которые не нужно настраивать для автоматической сортировки. This overload is useful when sorting by columns with values that can be meaningfully ordered, but which you do not want to configure for automatic sorting. При вызове этой перегрузки SortMode и передаче столбца со DataGridViewColumnSortMode.Automaticзначением свойства, SortedColumn свойства и SortOrder задаются автоматически, а соответствующий глиф сортировки отображается в заголовке столбца. When you call this overload and pass in a column with a SortMode property value of DataGridViewColumnSortMode.Automatic, the SortedColumn and SortOrder properties are set automatically and the appropriate sorting glyph appears in the column header.

Если элемент управления привязан к внешнему источнику данных путем DataSource установки свойства, Sort(DataGridViewColumn,ListSortDirection) перегрузка метода не работает для непривязанных столбцов. DataGridView When the DataGridView control is bound to an external data source by setting the DataSource property, the Sort(DataGridViewColumn,ListSortDirection) method overload does not work for unbound columns. Кроме того, если VirtualMode свойство равно true , можно вызвать эту перегрузку только для связанных столбцов. Additionally, when the VirtualMode property is true , you can call this overload only for bound columns. Чтобы определить, привязан ли столбец к данным, проверьте IsDataBound значение свойства. To determine whether a column is data-bound, check the IsDataBound property value. Сортировка непривязанных столбцов в связанном режиме не поддерживается. Sorting unbound columns in bound mode is not supported.

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

Можно настроить DataGridView с Sort(IComparer) помощью перегрузки Sort метода или путем обработки SortCompare события. You can customize DataGridView by using the Sort(IComparer) overload of the Sort method or by handling the SortCompare event.

Перегрузка метода принимает экземпляр класса, который IComparer реализует интерфейс в качестве параметра. Sort(IComparer) The Sort(IComparer) method overload takes an instance of a class that implements the IComparer interface as a parameter. Эта перегрузка полезна, если нужно предоставить настраиваемую сортировку. Например, если значения в столбце не имеют естественного порядка сортировки или если естественный порядок сортировки не подходит. This overload is useful when you want to provide custom sorting; for example, when the values in a column do not have a natural sort order or when the natural sort order is inappropriate. В этом случае нельзя использовать автоматическую сортировку, но по-прежнему необходимо, чтобы пользователи могли сортировать, щелкая заголовки столбцов. In this case, you cannot use automatic sorting, but you might still want your users to sort by clicking the column headers. Эту перегрузку можно вызвать в обработчике для ColumnHeaderMouseClick события, если заголовки столбцов не используются для выбора. You can call this overload in a handler for the ColumnHeaderMouseClick event if you do not use column headers for selection.

Перегрузка метода работает, только DataGridView если элемент управления не привязан к VirtualMode внешнему источнику данных, а свойство имеет false значение. Sort(IComparer) The Sort(IComparer) method overload works only when the DataGridView control is not bound to an external data source and the VirtualMode property value is false . Чтобы настроить сортировку для столбцов, привязанных к внешнему источнику данных, необходимо использовать операции сортировки, предоставляемые источником данных. To customize sorting for columns bound to an external data source, you must use the sorting operations provided by the data source. В виртуальном режиме необходимо предоставить собственные операции сортировки для несвязанных столбцов. In virtual mode, you must provide your own sorting operations for unbound columns.

Читайте также:  Как повысить просмотры на youtube

Чтобы использовать Sort(IComparer) перегрузку метода, необходимо создать собственный класс, IComparer реализующий интерфейс. To use the Sort(IComparer) method overload, you must create your own class that implements the IComparer interface. Этот интерфейс требует, чтобы ваш класс реализовал IComparer.Compare метод, DataGridView который передает DataGridViewRow объекты в качестве входных данных при Sort(IComparer) вызове перегрузки метода. This interface requires your class to implement the IComparer.Compare method, to which the DataGridView passes DataGridViewRow objects as input when the Sort(IComparer) method overload is called. В этом случае можно вычислить правильный порядок строк на основе значений в любом столбце. With this, you can calculate the correct row ordering based on the values in any column.

Перегрузка метода не SortedColumn задает SortOrder Свойстваи,поэтомунеобходимовсегдаустанавливатьсвойстводлявыводаглифасортировки.DataGridViewColumnHeaderCell.SortGlyphDirection Sort(IComparer) The Sort(IComparer) method overload does not set the SortedColumn and SortOrder properties, so you must always set the DataGridViewColumnHeaderCell.SortGlyphDirection property to display the sorting glyph.

В качестве альтернативы Sort(IComparer) перегрузке метода можно предоставить пользовательскую сортировку, реализовав обработчик SortCompare для события. As an alternative to the Sort(IComparer) method overload, you can provide custom sorting by implementing a handler for the SortCompare event. Это событие возникает, когда пользователи щелкают заголовки столбцов, настроенных для автоматической сортировки, или при Sort(DataGridViewColumn,ListSortDirection) вызове перегрузки Sort метода. This event occurs when users click the headers of columns configured for automatic sorting or when you call the Sort(DataGridViewColumn,ListSortDirection) overload of the Sort method. Это событие возникает для каждой пары строк в элементе управления, что позволяет вычислить правильный порядок. The event occurs for each pair of rows in the control, enabling you to calculate their correct order.

Событие не происходит, DataSource если свойство задано или если VirtualMode свойство имеет true значение. SortCompare The SortCompare event does not occur when the DataSource property is set or when the VirtualMode property value is true .

Есть некий набор данных который биндится к датагриду. Здесь все ок. Но появилась необходимость отсортировать в этом гриде строки по определенному столбцу. например в порядке возрастания отсортировать записи с ценой, НО начиная со 2 -ой строки. Т.е. первая строка должна быть зафиксирована, а все остальные строки начиная со 2-ой должны быть отсортированы. Если бы не условие что со второй строки, то все просто:

Но как сделать с условием, не могу понять.

1 ответ 1

Кастомный компаратор такой

Весь пример можно скачать здесь

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# winforms или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.1.10.35756

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock detector