Skip to content

Группировка

Data Grid может группировать данные по одному или нескольким столбцам. Группировка данных объединяет строки с одинаковыми значениями в столбцах в одни и те же группы данных.

datagrid-grouping

Пользователь может сгруппировать данные следующим образом:

  • Перетащите заголовок столбца на панель "Группа".
  • Щелкните правой кнопкой мыши заголовок столбца и выберите команду "Сгруппировать по этому столбцу".

    datagrid-columnheadermenu

Чтобы разгруппировать данные, пользователь может выполнить одно из следующих действий:

  • Перетащите заголовок столбца группы с панели "Группа".
  • Щелкните правой кнопкой мыши заголовок столбца группы и выберите команду "Разгруппировать".

    datagrid-groupcolumn-headermenu

Когда вы применяете группировку по столбцу, данные этого столбца сортируются . Пользователь может щелкнуть по заголовку столбца группы, чтобы изменить порядок сортировки.

Групповая панель

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

datagrid-grouppanel

Используйте свойство ShowGroupPanel DataGrid, чтобы указать видимость групповой панели. Пользователь может скрыть, а затем восстановить панель групп, используя контекстное меню заголовков столбцов:

grouppanel-hide-via-contextmenu

Групповые столбцы

Когда вы группируете по столбцу, этот столбец перемещается из таблицы на панель групп. Свойство ShowGroupedColumns имеет значение true, чтобы отображать столбцы группы на панели групп и в таблице одновременно. На следующей картинке показано свойство настройки ShowGroupedColumns:

datagrid-showgroupedcolumns

Предотвращение группировки

Вы можете отключить свойство AllowSorting столбца, чтобы запретить пользователю выполнять операции сортировки и группировки над этим столбцом.

Свойство DataGridControl.AllowSorting позволяет вам запретить сортировку и групповые операции пользователей для любого столбца.

Если столбец не поддерживает сортировку (например, когда столбец отображает данные картинки или привязан к объекту, который не реализует интерфейс IComparable), данные не могут быть сгруппированы по этому столбцу. Вы можете изменить это дефолтное поведение, как описано в следующем разделе: Настройка логики группировки .

Настройка логики группировки

Столбцы группы всегда отсортированы в порядке возрастания или убывания, как указано свойством ColumnBase.SortDirection.

Во время операции группировки строки таблицы объединяются в группы в соответствии со значениями редактирования или отображения значений столбцов группы. Логика группировки и сортировки по умолчанию зависит от встроенного редактора столбцов и типа данных привязанного свойства:

  • Группировка/сортировка по значениям редактирования — все столбцы, кроме тех, у которых есть встроенный ComboBoxEditor.
  • Группировка/сортировка по тексту отображения — столбцам со встроенным ComboBoxEditor.
  • Нет группировки/сортировки — столбцы, привязанные к объектам, которые не реализуют интерфейс IComparable. Например, типы данных картинок не реализуют этот интерфейс, таким образом, соответствующие столбцы не поддерживают операции сортировки и группировки по умолчанию. Чтобы принудительно отсортировать и сгруппировать эти столбцы, реализуйте пользовательскую сортировку и пользовательскую группировку для этих столбцов.

Свойство ColumnBase.SortMode позволяет вам изменить режим сортировки/группировки для столбца. Доступны следующие опции:

  • SortMode.Value — Сортировка/группировка по значениям редактирования ячеек.
  • SortMode.DisplayText — Сортировка/группировка текста по ячейкам.
  • SortMode.Custom — Включает пользовательскую сортировку и группировку. Задайте свойству SortMode значение Custom, а затем обработайте событие DataGridControl.CustomColumnGroup и/или DataGridControl.CustomColumnSort, чтобы реализовать пользовательскую логику группировки и/или пользовательской сортировки. Дополнительную информацию смотрите по следующим ссылкам:

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

Чтобы реализовать пользовательские правила группировки для определенного столбца(ов), установите для свойства ColumnBase.SortMode столбца значение Custom и обработайте событие DataGridControl.CustomColumnGroup.

Событие CustomColumnGroup срабатывает для каждого столбца группы для сравнения пар соседних строк сетки. При обработке этого события вам следует указать, следует ли объединять строки в одну группу.

Следующие параметры события позволяют идентифицировать групповые строки, значения и задать результат сравнения:

  • Column — столбец обрабатываемой в данный момент группы.
  • SourceItemIndex1 и SourceItemIndex2 — индексы в привязанном источнике объектов (DataGridControl.ItemsSource) элементов (бизнес-объектов), которые соответствуют обрабатываемым в данный момент строкам таблицы.
  • Value1 и Value2 — значения группового столбца в обрабатываемых в данный момент строках таблицы.
  • Result — Результат пользовательского сравнения. Задайте для Result значение true, чтобы поместить строки в одну группу. Установите для Result значение false, если строки необходимо поместить в разные группы. Установите для Result значение null, чтобы применить логику группировки по умолчанию.

Чтобы повысить производительность контрола, срабатывает событие CustomColumnGroup для сравнения строки с небольшим набором соседних строк сетки (в соответствии с текущим порядком сортировки). Это событие срабатывает не для всех возможных комбинаций двух строк сетки. Если вам нужно изменить логику сортировки строк по умолчанию и разместить определенные строки рядом друг с другом, обработайте событие ColumnView.CustomColumnSort.

Пример - Группировка по годам При группировании по столбцу Даты и времени

Предположим, что контрол Data Grid содержит столбец HireDate, в котором отображаются значения даты и времени. При группировании по этому столбцу поведение контрола при группировке по умолчанию заключается в объединении строк с уникальными значениями даты и времени.

В этом примере применяются пользовательские правила группировки: строки группируются по части года значений HireDate. Для выполнения этой задачи свойству SortOrder столбца HireDate присваивается значение Custom, и обрабатываются следующие события:

  • DataGridControl.CustomColumnGroup — Реализует пользовательскую логику группировки.
  • DataGridControl.CustomGroupValueDisplayText — Отображает годовую часть значения даты и времени в строках группы. Смотрите Текст группирующей строки .

В демонстрационных целях свойство ShowGroupedColumns включено для одновременного отображения сгруппированного столбца HireDate на панели групп и в таблице.

datagrid-grouping-customcolumngroup-example

dataGrid.Columns["HireDate"].SortMode = Eremex.AvaloniaUI.Controls.DataControl.SortMode.Custom;
dataGrid.CustomColumnGroup += DataGrid_CustomColumnGroup;
dataGrid.CustomGroupValueDisplayText += DataGrid_CustomGroupValueDisplayText;        
dataGrid.ShowGroupedColumns = true;

private void DataGrid_CustomColumnGroup(object sender, DataGridCustomColumnGroupEventArgs e)
{
    if (e.Column.FieldName != "HireDate")
        return;
    DateTime employeeHireDate1 = (DateTime)e.Value1;
    DateTime employeeHireDate2 = (DateTime)e.Value2;
    e.Result = employeeHireDate1.Year == employeeHireDate2.Year;
}

private void DataGrid_CustomGroupValueDisplayText(object sender, DataGridCustomGroupValueDisplayTextEventArgs e)
{
    if (e.Column.FieldName != "HireDate")
        return;
    DateTime hireDate = (DateTime)e.Value;
    e.DisplayText = hireDate.Year.ToString();
}

Группа в коде

Чтобы сгруппировать данные по столбцам в коде, выполните следующее:

  1. Отсортируйте этот столбец и позиции его (их) в начале отсортированной коллекции столбцов. Вы можете отсортировать столбец, используя свойства SortIndex и SortDirection. Смотрите раздел Сортировка для получения дополнительной информации.
  2. Задайте свойству DataGridControl.GroupCount значение количества столбцов группы.

Следующий код группирует данные по двум столбцам.

GridColumn column1 = dataGrid.Columns["EmploymentType"];
GridColumn column2 = dataGrid.Columns["Position"];

if(column1 != null && column2 != null)
{
    dataGrid.BeginDataUpdate();
    column1.SortIndex = 0;
    column2.SortIndex = 1;
    column2.SortDirection = System.ComponentModel.ListSortDirection.Descending;
    dataGrid.GroupCount = 2;
    dataGrid.EndDataUpdate();
}

В этом примере используются методы BeginDataUpdate и EndDataUpdate для предотвращения ненужных обновлений при изменении нескольких свойств группировки/сортировки. Data Grid обновляется только после вызова метода EndDataUpdate.

Без использования методов BeginDataUpdate и EndDataUpdate Data Grid обновляется после каждого изменения любого свойства группы/сортировки.

За каждым вызовом метода BeginDataUpdate должен следовать вызов метода EndDataUpdate.

Группировать строки

Групповые строки используются для формирования иерархии строк при группировании данных. Они отображают значения соответствующих столбцов группы. Строки группы не существуют в связанном источнике объекта.

Определение строк группы

Индексы строк позволяют идентифицировать строки таблицы в коде. Строки группы имеют отрицательные индексы строк, в то время как индексы строк строк данных неотрицательны.

Свойство FocusedRowIndex позволяет получить текущую сфокусированную группу или строку данных или переместить фокус на определенную группу или строку данных. Следующий код перемещает фокус на первую строку группы:

// If data is grouped, focus the first group row.
if (dataGrid.GroupCount > 0)
    dataGrid.FocusedRowIndex = -1;

Смотрите также: Перемещение по строкам группы .

Разворачивать и сворачивать строки групп

Пользователь может разворачивать и сворачивать строки групп следующим образом:

  • Нажмите кнопку развернуть строку группы

  • Нажмите кнопки "+"/"-" и "→"/"←" клавиши на клавиатуре

В коде вы можете контролировать распахивание группирующей строки с помощью следующих элементов API:

  • AutoExpandAllGroups — Указывает, следует ли автоматически распахивать группирующие строки после каждой операции группировки данных.
  • CollapseAllGroups — Сворачивает все группирующие строки.
  • CollapseGroupRow — Сворачивает строку группы.
  • ExpandAllGroups — Расширяет все группирующие строки.
  • ExpandGroupRow — Расширяет строку группы.
  • IsGroupRow — Указывает, является ли конкретная строка строкой группы.
  • IsGroupRowExpanded — Указывает, распахнута ли группирующая строка.

Перемещение по строкам группы

Строки группы владеют дочерними строками данных, и они также могут владеть другими строками группы, если данные сгруппированы по двум или более столбцам.

Используйте следующие методы для перебора строк группы и их дочерних элементов:

  • GetGroupChildRowCount — Возвращает количество непосредственных дочерних строк указанной группирующей строки. Этот метод возвращает -1, если указанная строка является строкой данных, поскольку строки данных не имеют дочерних элементов.

    Метод GetGroupChildRowCount без параметров возвращает количество строк группы на корневом уровне. Если данные не сгруппированы, эта перегрузка возвращает -1.

  • GetGroupChildRowIndex — Возвращает индекс строки указанной дочерней строки. Метод GetGroupChildRowIndex имеет две перегрузки:

    • GetGroupChildRowIndex(int rowIndex, int childIndex) — Получает индекс строки дочерней строки, принадлежащей указанной групповой строке. Дочерняя строка должна быть непосредственным дочерним элементом указанной группирующей строки. Параметр rowIndex указывает строку родительской группы. Параметр childIndex определяет визуальную позицию целевой дочерней строки среди ее одноуровневых элементов.

    • GetGroupChildRowIndex(int childIndex) — Возвращает индекс строки корневой группы, отображаемой в позиции childIndex. Параметр childIndex определяет визуальную позицию целевой строки корневой группы среди других строк корневой группы.

  • GetParentRowIndex — Получает индекс строки строки родительской группы строки. Этот метод возвращает константу DataGridControl.InvalidRowIndex для строк, у которых нет родительских элементов.

Группировать значения строк

Используйте метод GetGroupRowValue для извлечения группового значения из определенной групповой строки.

Текст групповой строки

Текст по умолчанию, отображаемый в строках группы, определяется значениями соответствующих столбцов группы. Событие CustomGroupValueDisplayText позволяет вам указать пользовательский текст для отображения в строках группы. Это событие запускается повторно для каждой группирующей строки. Используйте аргументы события, чтобы определить текущую обрабатываемую строку группы и ее значение. Чтобы задать пользовательское отображаемое значение, задайте аргумент события DisplayText.



* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.