Skip to content

Перетаскивание строк

Data Grid поддерживает функцию перетаскивания строк как в рамках контрола Grid, так и во внешних контролах.

grid-dragdrop

Включить перетаскивание строк

Установите для свойства DataGridControl.AllowDragDrop значение true, чтобы включить перетаскивание строк. В этом режиме пользователь может перетаскивать строку внутри контрола Data Grid и за пределы контрола. Операция перетаскивания перемещает строку в другую позицию, а также изменяет позицию соответствующего бизнес-объекта в источнике данных.

Если строка перетаскивается во внешний контрол, дефолтное поведение Data Grid заключается в удалении строки из текущего контрола и удалении соответствующего бизнес-объекта из источника данных контрола. Смотрите Перетаскивание строк между контролами для получения информации о том, как предотвратить удаление строк и бизнес-объектов.

Перетаскивание нескольких строк поддерживается, если вы включили выбор нескольких строк с помощью свойства DataControlBase.SelectionMode (см. Строки - Выбор нескольких строк (выделение) ).

Data Grid не поддерживает операции автоматического копирования при перетаскивании. Нажатие клавиши CTRL не действует.

Перетаскивание отсортированных и сгруппированных данных

По умолчанию, когда данные в контроле Grid отсортированы или сгруппированы , операции перетаскивания строк отключены. Установите для свойства DataGridControl.AllowDragDropSortedRows значение true, чтобы разрешить операции перетаскивания внутри отсортированных/сгруппированных контролов.

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

Обработка операций перетаскивания с событиями

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

Начните с перетаскивания

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

  • e.Data — Указывает объект Avalonia.Input.IDataObject, содержащий данные текущей операции перетаскивания.
  • e.DragElement — Перетаскивается внутренний визуальный элемент контрола.
  • e.Effects — Определяет эффект перетаскивания. Установите для этого параметра значение DragDropEffects.None, чтобы отменить текущую операцию перетаскивания. Эффект перетаскивания также определяет значок указателя мыши.
  • e.Items — Массив элементов источника данных (бизнес-объектов), соответствующих перетаскиваемым строкам. Если перетаскивается группирующая строка, массив e.Items содержит бизнес-объекты, которые соответствуют строкам данных, отображаемым внутри этой группирующей строки. Чтобы определить, перетаскивается ли группирующая строка, смотрите e.DragRowIndexes.
  • e.DragRowIndexes — Массив индексов перетаскиваемых строк. Строки данных имеют неотрицательные индексы, в то время как индексы строк групп являются отрицательными. Дополнительную информацию смотрите в следующем разделе: Идентификация и получение строк

Пример - Предотвращение запуска операции перетаскивания для определенных строк данных

Следующий обработчик событий StartDrag отключает операции перетаскивания для строк, содержащих строку "Manager" в столбце Position.

private void DataGrid_StartDrag(object sender, DataGridStartDragEventArgs e)
{
    // It is assumed that items in the grid's data source are EmployeeInfo objects. 
    // The EmployeeInfo class contains the Position property of the string type.
    foreach(EmployeeInfo item in e.Items)
    {
        if(item.Position.Contains("Manager"))
        {
            e.Effects = Avalonia.Input.DragDropEffects.None;
            return;
        }
    }
}

Пример - Предотвращение операций перетаскивания для групповых строк

В следующем примере обрабатывается событие StartDrag, чтобы отключить операции перетаскивания строк группы. Строки группы имеют отрицательные индексы, поэтому обработчик события StartDrag проверяет, содержит ли массив e.DragRowIndexes отрицательные индексы.

private void DataGrid_StartDrag(object sender, DataGridStartDragEventArgs e)
{
    foreach(int rowIndex in e.DragRowIndexes)
        if(rowIndex < 0) e.Effects = Avalonia.Input.DragDropEffects.None;
}

Обработка этапа перетаскивания при перетаскивании

Событие DataGridControl.DragOver вызывается повторно, когда пользователь перетаскивает строку(ы) поверх другой строки. Аргументы события позволяют идентифицировать информацию, относящуюся к текущей операции перетаскивания:

  • e.Items — Массив элементов источника данных (бизнес-объектов), которые соответствуют перетаскиваемым строкам. Если перетаскивается группирующая строка, массив e.Items содержит бизнес-объекты, которые соответствуют строкам данных, отображаемым внутри этой группирующей строки.
  • e.TargetRowIndexИндекс строки, по которой перетаскивается строка(строки).
  • e.DropPosition — Указывает потенциальную позицию удаления относительно целевой строки. Доступные опции включают:

    • DropPosition.Before — Перетаскиваемые строки, если они удалены, будут добавлены на том же уровне иерархии, что и целевая строка.
    • DropPosition.After — Перетаскиваемые строки, если они удалены, будут добавлены на том же уровне иерархии, что и целевая строка.
    • DropPosition.Inside — Перетаскиваемые строки, если они будут удалены, будут добавлены как дочерние к строке целевой группы. Эта опция действует при перетаскивании по строкам группы.
  • e.KeyModifiers — Указывает, будет ли нажата клавиша ALT, SHIFT и/или CTRL во время события DragOver.

  • e.Data — Указывает объект Avalonia.Input.IDataObject, содержащий данные текущей операции перетаскивания.
  • e.Effects — Определяет эффект перетаскивания. Установите для этого параметра значение DragDropEffects.None, чтобы отменить текущую операцию перетаскивания. Эффект перетаскивания также определяет значок указателя мыши.

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

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

private void DataGrid_DragOver(object sender, DataGridDragEventArgs e)
{
    if(e.TargetRowIndex < 0) 
        e.Effects = Avalonia.Input.DragDropEffects.None;
}

Завершить перетаскивание

Вы можете обрабатывать два события для выполнения действий при удалении строки во время операции перетаскивания:

  • DataGridControl.Drop — Срабатывает, когда строка вот-вот будет перенесена на другую строку таблицы. Аргументы события совпадают с аргументами события DataGridControl.DragOver.

    Чтобы отменить операцию удаления в определенных случаях, обработайте событие Drop и установите для его параметра e.Handled значение true.

    Если строка удалена за пределы текущего контрола Data Grid, событие Drop для этого контрола не срабатывает. Смотрите описание события DataGridControl.CompleteDragDrop ниже для получения дополнительной информации.

Пример — Изменение значений удаленной строки

The following `Drop` event handler changes a value of a dragged row(s) when it is dropped. It is assumed that the data source contains the _"EmploymentType"_ field. The code below sets the dropped row's _"EmploymentType"_ field to the target row's _"EmploymentType"_ field value.

``` cs
private void DataGrid_Drop(object sender, DataGridDragEventArgs e)
{
    DataGridControl grid = sender as DataGridControl;
    GridColumn colEmploymentType = grid.Columns["EmploymentType"];
    EmploymentType newEmploymentType = (EmploymentType)grid.GetCellValue(e.TargetRowIndex, colEmploymentType);
    foreach (EmployeeInfo item in e.Items)
    {
        item.EmploymentType = newEmploymentType;
    }
}
```
  • DataGridControl.CompleteDragDrop — Срабатывает после завершения операции перетаскивания в пределах текущего контрола или за пределами текущего контрола.

    Событие DataGridControl.CompleteDragDrop срабатывает после события DataGridControl.Drop.

    Для события DataGridControl.CompleteDragDrop доступны следующие аргументы:

    • e.Items — Массив элементов (бизнес-объектов), соответствующих удаленным строкам.
    • e.Effects — Возвращает эффект перетаскивания, который был установлен в обработчике событий Drop контрола, в котором была удалена строка.

    Смотрите также: Перетаскивание строк между контролами

Опции перетаскивания

Data Grid содержит следующие опции для настройки операций перетаскивания строк:

  • DataGridControl.AutoExpandOnDrag — Возвращает или задает, будут ли автоматически разворачиваться свернутые группирующие строки при наведении курсора мыши во время операции перетаскивания.
  • DataGridControl.AutoExpandDelayOnDrag — Возвращает или устанавливает задержку перед тем, как свернутые группирующие строки будут автоматически развернуты при наведении на них курсора мыши во время операции перетаскивания.
  • DataGridControl.AllowScrollingOnDrag — Получает или устанавливает, будет ли Data Grid автоматически прокручивать строки при перетаскивании строки по верхнему или нижнему краю контрола.

Перетаскивание строк между контролами

Перетаскивание строк автоматически поддерживается между контролами DataGridControl, TreeListControl и TreeViewControl. Используйте опцию AllowDragDrop, предоставляемую этими контролами, чтобы включить для них функцию перетаскивания.

Визуальная индикация перетаскивания

При перетаскивании строки контролы DataGridControl, TreeListControl и TreeViewControl визуально указывают потенциальную позицию удаления.

grid-rowdragdrop-visualposition

Автоматическое перемещение строки и ее элемента из исходного в целевой контрол

DataGridControl, TreeListControl и TreeViewControl поддерживают автоматическое перемещение перетаскиваемой строки между этими контролами во время операции перетаскивания: новая строка, содержащая перетаскиваемые данные, добавляется в целевой контрол, а перетаскиваемая строка затем удаляется из исходного контрола. Соответствующий элемент (бизнес-объект) также передается между источниками объектов исходного и целевого контролов.

Автоматическое перемещение строки и соответствующего элемента происходит, если тип данных элементов в исходном контроле совпадает или совместим с типом данных элементов в целевом контроле. Смотрите метод Type.IsAssignableFrom, используемый для проверки совместимости типов данных.

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

  • Обработайте событие Drop целевого контрола и установите для его параметра события e.Effects значение Avalonia.Input.DragDropEffects.None.

  • Обработайте событие DataGridControl.CompleteDragDrop в контроле источника и установите для параметра события e.Handled значение true.

    private void DataGrid_CompleteDragDrop(object sender, DataGridCompleteDragDropEventArgs e)
    {
        e.Handled = true;
    }
    

Перетаскивание на другие контролы

Контролы DataGridControl, TreeListControl и TreeViewControl не поддерживают автоматическое перетаскивание строк в другие контролы (например, стандартный Avalonia DataGrid). Чтобы разрешить перетаскивание строк в эти контролы, включите для них функцию перетаскивания, используя Avalonia.Input.DragDrop.AllowDrop attached-свойство. Обработайте прикрепленное событие Avalonia.Input.DragDrop.Drop целевого контрола, чтобы принять перетаскиваемые строки. При обработке события DragDrop.Drop вы можете получить доступ к перетаскиваемым строкам из параметра события Data.



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