Строки¶
Строки данных представляют элементы из привязанного источника элементов. При группировке данных DataGrid создаёт строки группы для объединения строк с одинаковыми значениями группировки. Строки группы не существуют в источнике элементов.
Высота строки¶
Изначально все строки имеют одинаковую высоту, достаточную для отображения одной строки текста. DataGrid позволяет задать пользовательскую высоту строки, а также включить автоматический расчёт высоты строки для отображения больших текстовых данных в ячейках.
Пользовательская высота строки¶
- Свойство
DataControlBase.RowMinHeight— получает или задаёт минимальную высоту строки.
Если функция автоматической высоты строки отключена, все строки имеют одинаковую высоту, заданную свойством DataControlBase.RowMinHeight.
Автоматическая высота строки¶
Для колонок, содержащих длинный текст, вы можете включить перенос текста, чтобы динамически подстраивать высоту строк и отображать полное содержимое ячеек.
Чтобы включить перенос текста для ячеек колонки, назначьте объект TextEditorProperties (или его потомок, например ButtonEditorProperties) свойству GridColumn.EditorProperties, и установите параметр TextEditorProperties.TextWrapping в значение Wrap.
Tip
Объект TextEditorProperties используется для настройки встроенного редактора TextEditor для колонки. Во время выполнения редактор создаётся с использованием этих настроек. Дополнительную информацию см. в разделе Редактирование данных.
Следующий код включает перенос текста для колонки сетки.
<mxdg:GridColumn FieldName="Notes" Width="*" MinWidth="80">
<mxdg:GridColumn.EditorProperties>
<mxe:TextEditorProperties TextWrapping="Wrap"/>
</mxdg:GridColumn.EditorProperties>
</mxdg:GridColumn>
Автоматическая подстройка высоты строки при горизонтальной прокрутке¶
Горизонтальная виртуализация DataGrid повышает производительность контрола за счёт сокращения времени загрузки.
При включённой этой функции (по умолчанию) высота строк рассчитывается автоматически на основе содержимого текущих видимых ячеек. Ячейки за пределами области просмотра не влияют на расчёт высоты строки. При прокрутке к ячейкам с другой высотой содержимого высота строки динамически изменяется. Чтобы предотвратить динамическое изменение высоты строк при горизонтальной прокрутке, используйте свойство DataGridControl.AllowHorizontalVirtualization, чтобы отключить горизонтальную виртуализацию.
Идентификация и получение строк¶
Чтобы обеспечить идентификацию строк, DataGrid присваивает строкам данных и группы индексы строк. Индексы строк идентифицируют строки в членах API, используемых для получения и установки значений ячеек, перемещения фокуса между строками и перебора строк.
- Индексы строк отражают порядок строк данных и группы в DataGrid.
- Строки данных нумеруются с использованием неотрицательных индексов, начиная с нуля. Верхняя строка данных имеет индекс 0, вторая строка данных имеет индекс 1, и так далее.
- Строки группы нумеруются с использованием отрицательных индексов. Верхняя строка группы имеет индекс -1, вторая строка группы имеет индекс -2, и так далее
- Индексы строк используются для идентификации как видимых, так и скрытых (внутри свёрнутых групп) строк.
- Когда порядок строк изменяется (например, при сортировке или группировке данных), строкам присваиваются новые индексы согласно их новым позициям.
- Индексы строк не присваиваются строкам, скрытым в результате фильтрации данных.
Когда данные не сгруппированы, индексы строк совпадают с видимыми индексами строк:
Когда данные сгруппированы, индексы строк и видимые индексы строк не совпадают:
Специальные индексы строк¶
DataGrid резервирует следующие предопределённые индексы строк для идентификации специальных строк:
- Константа
DataControlBase.AutoFilterRowIndex— идентифицирует строку автофильтра. Эта строка позволяет пользователю вводить текст в её ячейках для фильтрации данных по соответствующим колонкам. Дополнительную информацию см. в следующем разделе: Поиск и фильтрация.
Пример: Вы можете присвоить значение константы DataControlBase.AutoFilterRowIndex свойству DataGridControl.FocusedRowIndex, чтобы установить фокус на строке автофильтра.
- Константа
DataGridControl.InvalidRowIndex— идентифицирует строку, не существующую в DataGrid. Эта константа может возвращаться методами DataGrid, используемыми для получения индексов строк.
Пример: метод GetParentRowIndex позволяет вернуть родительскую строку группы для строки, когда данные сгруппированы. Этот метод возвращает значение DataGridControl.InvalidRowIndex для строки, не имеющей родительской строки группы.
Исходные элементы и индексы исходных элементов¶
Строки данных соответствуют элементам (бизнес-объектам) в привязанном источнике элементов (DataControlBase.ItemsSource). Позиция элемента в источнике элементов называется индексом исходного элемента.
Вы можете использовать следующие методы для получения исходного элемента строки данных и его индекса.
GetSourceItemByRowIndex— возвращает исходный элемент (бизнес-объект) строки, указанной по индексу строки.GetSourceItemByVisibleRowIndex— возвращает исходный элемент (бизнес-объект) строки, указанной по видимому индексу.GetSourceItemIndexByRowIndex— возвращает индекс исходного элемента (индекс бизнес-объекта в источнике элементов) строки, указанной по индексу строки.GetSourceItemIndexByVisibleRowIndex— возвращает индекс исходного элемента (индекс бизнес-объекта в источнике элементов) строки, указанной по видимому индексу.
Для выполнения обратного преобразования индексов см. следующие методы:
GetRowIndexBySourceItemIndex— возвращает индекс строки, указанной по индексу исходного элемента.GetVisibleRowIndexBySourceItemIndex— возвращает видимый индекс строки, указанной по индексу исходного элемента (индексу бизнес-объекта в источнике элементов).
Индексы исходных элементов начинаются с нуля. При сортировке, группировке или фильтрации строк индексы исходных элементов строк сетки не изменяются.
Строки группы не имеют соответствующих элементов в источнике элементов, поэтому к ним нельзя обращаться с помощью исходных элементов и их индексов.
Связанный API¶
DataGrid предоставляет члены API для получения строк по индексам и преобразования между индексами строк, видимыми индексами строк и индексами элементов источника данных. Следующий список суммирует эти члены API:
FocusedRowIndex— получает или задаёт индекс сфокусированной строки. Вы можете использовать это свойство для перемещения фокуса на определённую строку.GetRowIndexBySourceItemIndex— возвращает индекс строки, указанной по индексу исходного элемента.GetRowIndexByVisibleRowIndex— возвращает индекс строки, указанной по видимому индексу.GetSourceItemByRowIndex— возвращает исходный элемент (бизнес-объект) строки, указанной по индексу строки.GetSourceItemByVisibleRowIndex— возвращает исходный элемент (бизнес-объект) строки, указанной по видимому индексу.GetSourceItemIndexByRowIndex— возвращает индекс исходного элемента (индекс бизнес-объекта в источнике элементов) строки, указанной по индексу строки.GetSourceItemIndexByVisibleRowIndex— возвращает индекс исходного элемента (индекс бизнес-объекта в источнике элементов) строки, указанной по видимому индексу.GetVisibleRowIndexByRowIndex— возвращает видимый индекс строки, указанной по индексу строки.GetVisibleRowIndexBySourceItemIndex— возвращает видимый индекс строки, указанной по индексу исходного элемента (индексу бизнес-объекта в источнике элементов).VisibleRowCount
Методы для перебора строк группы и их дочерних элементов:
Методы для получения и установки значений ячеек:
Сфокусированная строка¶
Используйте свойство DataGridControl.FocusedRowIndex для получения индекса сфокусированной строки. Свойство DataGridControl.FocusedItem позволяет получить исходный объект данных сфокусированной строки.
Чтобы переместить фокус на определённую строку, вы можете присвоить индекс этой строки свойству DataGridControl.FocusedRowIndex.
Множественное выделение строк (подсветка)¶
DataGrid поддерживает режим множественного выделения строк, который позволяет вам и вашему пользователю выделять (подсвечивать) несколько строк одновременно.
Установите свойство SelectionMode в значение Multiple, чтобы включить режим множественного выделения строк.
Выделение строк с помощью мыши и клавиатуры¶
Пользователи могут выделять несколько строк с помощью мыши и клавиатуры. Для этого нужно щёлкать по строкам, удерживая нажатой клавишу CTRL и/или SHIFT.
Работа с выделением строк в коде¶
Следующий API позволяет выделять/снимать выделение со строк и определять, выделена ли строка:
SelectAllSelectRowSelectRangeUnselectRowClearSelectionIsRowSelected
Чтобы получить выделение строк, используйте следующие члены:
GetSelectedRowIndexes— возвращает коллекцию индексов выделенных на данный момент строк.SelectedItems— задаёт коллекцию объектов данных (бизнес-объектов), соответствующих выделенным строкам.
Обработайте событие SelectionChanged, чтобы реагировать на изменения выделения строк.
Вызов любого метода, изменяющего состояние выделения строки, приводит к обновлению контрола DataGrid и вызывает событие SelectionChanged.
Чтобы выполнить пакетное изменение выделения строк и предотвратить лишние обновления, вы можете обернуть код, изменяющий состояние выделения строк, парой методов BeginSelection и EndSelection. В этом случае контрол перерисовывает выделение, а событие SelectionChanged возникает после вызова метода EndSelection.
dataGrid1.SelectionMode = Eremex.AvaloniaUI.Controls.DataControl.RowSelectionMode.Multiple;
// Start a batch update of the row selection.
dataGrid1.BeginSelection();
dataGrid1.ClearSelection();
dataGrid1.SelectRow(row1);
dataGrid1.SelectRow(row2);
//...
// Finish the batch update.
dataGrid1.EndSelection();
Сфокусированная строка и выделенные строки¶
Сфокусированная строка — это строка, получающая пользовательский ввод. Сфокусированная строка может не совпадать с выделенной (подсвеченной) строкой в режиме множественного выделения. Подробности см. в следующих разделах.
Сфокусированная строка в режиме одиночного выделения¶
В режиме одиночного выделения сфокусированная строка автоматически получает состояние выделения. Вы можете использовать свойство FocusedRowIndex и метод GetSelectedRowIndexes, чтобы получить сфокусированную строку.
Сфокусированная строка в режиме множественного выделения¶
Состояния фокуса и выделения различаются в режиме множественного выделения строк. Выделена строка или нет, можно определить по подсветке строки. Подсвечиваются только выделенные строки.
В режиме множественного выделения щелчок по строке одновременно устанавливает на ней фокус и выделяет её. Однако пользователь может переключить состояние выделения сфокусированной строки с помощью следующих действий:
- Нажать CTRL+SPACE.
- Щёлкнуть по сфокусированной строке, удерживая нажатой клавишу CTRL.
Когда вы выделяете строку в коде, эта строка не получает состояние фокуса в режиме множественного выделения, и наоборот.
Получение и установка значений строк¶
DataGrid предоставляет следующие методы для получения и установки значений в ячейках строк:
-
DataGridControl.GetCellValue— возвращает значение конкретной ячейки, адресуемой строкой и колонкой (или именем поля).Следующий код получает значение из сфокусированной строки для колонки, привязанного к полю FirstName:
-
DataGridControl.SetCellValue— устанавливает значение конкретной ячейки. -
DataGridControl.GetCellDisplayText— возвращает отображаемый текст конкретной ячейки, адресуемой строкой и колонкой (или именем поля). Отображаемый текст формируется в соответствии с параметрами форматирования, применёнными к встроенным редакторам. Вы также можете обработать событиеCustomColumnDisplayText, чтобы предоставить пользовательский отображаемый текст для ячеек. Чтобы предоставить пользовательский отображаемый текст значений для строк группы, обработайте событиеDataGridControl.CustomGroupValueDisplayText.
Вы также можете получать исходные элементы и их значения с помощью следующих членов API:
DataControlBase.FocusedItem— позволяет получить объект исходного элемента текущей сфокусированной строки.GetSourceItem— возвращает исходный объект по его индексу в источнике данных.GetSourceItemValue— возвращает значение конкретного поля в источнике данных по указанному индексу.DataGridControl.GetSourceItemByRowIndex— возвращает объект исходного элемента по индексу строки.DataGridControl.GetSourceItemByVisibleRowIndex— возвращает объект исходного элемента по видимому индексу строки.
Следующий код устанавливает свойство HiredDate для бизнес-объекта сфокусированной строки:
EmployeeInfo emp = dataGrid.FocusedItem as EmployeeInfo;
if (employee != null )
{
employee.HiredDate = DateTime.Today;
}
Обработка щелчков и двойных щелчков по строкам¶
Событие DataGridControl.RowClick позволяет выполнять действия, когда пользователь щёлкает по строке/ячейке один или несколько раз подряд. Параметр события e.ClickCount возвращает количество последовательных щелчков мышью.
Обратите внимание, что одиночный щелчок по ячейке по умолчанию активирует редактор ячейки. Последующие щелчки в этой ячейке перехватываются активным редактором ячейки, и событие DataGridControl.RowClick для этих щелчков не возникает. См. следующий раздел, чтобы узнать, как обрабатывать этот сценарий: Пример — обработка двойного щелчка по строке при включённом редактировании ячеек
Пример — обработка двойного щелчка по строке при отключённом редактировании ячеек¶
Следующий пример обрабатывает событие RowClick, чтобы определить двойной щелчок по строке, когда операции редактирования ячеек отключены.
dataGrid.AllowEditing = false;
//...
private void DataGrid_RowClick(object sender, Eremex.AvaloniaUI.Controls.DataGrid.DataGridRowClickEventArgs e)
{
if (e.ClickCount == 2)
{
//Row double-clicked
//...
}
}
Пример — обработка двойного щелчка по строке при включённом редактировании ячеек¶
В примере ниже показано, как обрабатывать двойные щелчки по строке, когда операции редактирования ячеек включены. В этом примере используется комбинация событий RowClick и ShowingEditor для ручного управления активацией редактора ячейки.
Реализован следующий сценарий:
- Одиночный щелчок активирует редактор ячейки (после небольшой задержки). Редактор активируется с помощью таймера, запускаемого в обработчике события
RowClick. - Двойной щелчок (и несколько последовательных щелчков) предотвращают активацию редактора ячейки. Выполните пользовательские действия при двойном щелчке по строке/ячейке в обработчике события
RowClick.
<mxdg:DataGridControl x:Name="dataGrid"
RowClick="DataGrid_RowClick"
ShowingEditor="DataGrid_ShowingEditor"
AllowEditing="True"
>
using Avalonia.Input;
public partial class MainView : UserControl
{
public MainView()
{
InitializeComponent();
this.Loaded += MainView_Loaded;
dataGrid.EditorShowMode = Eremex.AvaloniaUI.Controls.DataControl.EditorShowMode.PointerPressed;
}
bool canShowEditor = false;
DispatcherTimer clickTimer;
private void MainView_Loaded(object sender, Avalonia.Interactivity.RoutedEventArgs e)
{
var root = (IInputRoot)this.GetVisualRoot();
var settings = root.PlatformSettings;
var doubleClickTimeSpan = settings.GetDoubleTapTime(PointerType.Mouse);
clickTimer = new DispatcherTimer() { Interval = doubleClickTimeSpan };
clickTimer.Tick += ClickTimer_Tick;
dataGrid.ShowingEditor += DataGrid_ShowingEditor;
}
private void DataGrid_ShowingEditor(object sender, Eremex.AvaloniaUI.Controls.DataGrid.DataGridShowingEditorEventArgs e)
{
e.Cancel = !canShowEditor;
}
private void DataGrid_RowClick(object sender, Eremex.AvaloniaUI.Controls.DataGrid.DataGridRowClickEventArgs e)
{
canShowEditor = false;
if (e.ClickCount > 1)
{
clickTimer.Stop();
if (e.ClickCount == 2)
{
// Do something when a row is double-clicked
}
}
else
{
clickTimer.Start();
}
}
private void ClickTimer_Tick(object sender, EventArgs e)
{
clickTimer.Stop();
canShowEditor = true;
dataGrid.ShowEditor();
}
}
* Эта страница переведена с использованием технологий машинного перевода.




