Перетаскивание строк¶
Data Grid поддерживает функцию перетаскивания строк как в рамках контрола Grid, так и во внешних контролах.
Включить перетаскивание строк¶
Установите для свойства 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
визуально указывают потенциальную позицию удаления.
Автоматическое перемещение строки и ее элемента из исходного в целевой контрол¶
DataGridControl
, TreeListControl
и TreeViewControl
поддерживают автоматическое перемещение перетаскиваемой строки между этими контролами во время операции перетаскивания: новая строка, содержащая перетаскиваемые данные, добавляется в целевой контрол, а перетаскиваемая строка затем удаляется из исходного контрола. Соответствующий элемент (бизнес-объект) также передается между источниками объектов исходного и целевого контролов.
Автоматическое перемещение строки и соответствующего элемента происходит, если тип данных элементов в исходном контроле совпадает или совместим с типом данных элементов в целевом контроле. Смотрите метод Type.IsAssignableFrom
, используемый для проверки совместимости типов данных.
Чтобы предотвратить удаление строки и элемента в исходном контроле во время операции перетаскивания во внешние контролы, вы можете выполнить одно из следующих действий:
-
Обработайте событие
Drop
целевого контрола и установите для его параметра событияe.Effects
значениеAvalonia.Input.DragDropEffects.None
. -
Обработайте событие
DataGridControl.CompleteDragDrop
в контроле источника и установите для параметра событияe.Handled
значениеtrue
.
Перетаскивание на другие контролы¶
Контролы DataGridControl
, TreeListControl
и TreeViewControl
не поддерживают автоматическое перетаскивание строк в другие контролы (например, стандартный Avalonia DataGrid
). Чтобы разрешить перетаскивание строк в эти контролы, включите для них функцию перетаскивания, используя Avalonia.Input.DragDrop.AllowDrop
attached-свойство. Обработайте прикрепленное событие Avalonia.Input.DragDrop.Drop
целевого контрола, чтобы принять перетаскиваемые строки. При обработке события DragDrop.Drop
вы можете получить доступ к перетаскиваемым строкам из параметра события Data
.
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.