Skip to content

Столбцы

DataGrid поддерживает связанные и несвязанные столбцы. Связанные столбцы отображают значения из полей связанного источника данных. Несвязанные столбцы позволяют отображать пользовательские данные.

datagrid-columns

Столбцы DataGrid предоставляют свойства для настройки заголовка столбца, редактора ячеек, свойств сортировки/группировки и других опций.

Создание столбцов

Класс GridColumn представляет собой столбец в DataGridControl. GridColumn и TreeListColumn (столбец в TreeListControl) наследованы от класса ColumnBase. Таким образом, столбцы в контролах DataGrid и TreeList совместно используют множество элементов API.

Чтобы получить доступ к коллекции столбцов сетки, используйте свойство DataGridControl.Columns.

Контрол DataGrid не создает автоматически столбцы при привязке контрола к источнику данных. Четыре подхода позволяют создавать столбцы:

  • Ручное создание колонок

    Вы можете определить все столбцы DataGrid вручную в коллекции DataGridControl.Columns (в XAML или code-behind). При таком подходе у вас есть доступ к созданным объектам столбца по имени в коде.

    В следующем примере создаются два столбца DataGrid и настраивается формат отображения значений второго столбца:

    xmlns:mxdg="https://schemas.eremexcontrols.net/avalonia/datagrid"
    
    <mxdg:DataGridControl Name="dataGrid1" >                
        <mxdg:DataGridControl.Columns>
            <mxdg:GridColumn Name="colName" FieldName="Name" />
            <mxdg:GridColumn Name="colBirthdate" FieldName="Birthdate" >
                <mxdg:GridColumn.EditorProperties>
                    <mxe:TextEditorProperties DisplayFormatString="yyyy-MM-dd"/>
                </mxdg:GridColumn.EditorProperties>
            </mxdg:GridColumn>
        </mxdg:DataGridControl.Columns>
    </mxdg:DataGridControl>
    
  • Автоматическое создание колонок

    Включите опцию DataGridControl.AutoGenerateColumns для автоматического создания отсутствующих столбцов при привязке контрола к источнику данных. Вы можете применить определенные атрибуты (из пространств имен System.ComponentModel и System.ComponentModel.DataAnnotations) к свойствам бизнес-объекта, чтобы управлять автоматической генерацией столбцов и настраивать свойства автоматически генерируемых столбцов (например, отображаемое имя столбца и порядок).

  • Комбинирование ручного и автоматического способов создания колонок

    Вы можете объединить два описанных выше подхода: вручную создать необходимые столбцы в коллекции DataGridControl.Columns, а затем включить опцию DataGridControl.AutoGenerateColumns, чтобы делегировать генерацию других столбцов DataGrid.

  • Создание колонок из View Model

    DataGrid может создавать столбцы из источника столбцов, определенного в модели представления. Используйте свойства ColumnsSource и ColumnTemplate в этом сценарии. Смотрите раздел Создание столбцов из модели представления .

Смотрите Автоматическая генерация столбцов для получения информации об автоматически генерируемых столбцах.

Привязка столбцов к данным

Свойство GridColumn.FieldName позволяет привязать столбец к полю в таблице нижележащих данных или к публичному свойству бизнес-объекта. После привязки столбец извлекает значения из источника данных.

DataGrid также позволяет создавать несвязанные столбцы, значения которых следует вводить вручную, используя событие DataGridControl.CustomUnboundColumnData. Смотрите Несвязанные столбцы для получения дополнительной информации.

Не рекомендуется привязывать несколько столбцов DataGrid к одному и тому же полю данных/свойству.

В следующем примере создаются столбцы DataGrid и привязываются к ним данные.

xmlns:mxdg="https://schemas.eremexcontrols.net/avalonia/datagrid"

<mxdg:DataGridControl Grid.Column="3" Width="200" Name="dataGrid1" HorizontalAlignment="Stretch">
    <mxdg:DataGridControl.Columns>
        <mxdg:GridColumn Name="colFirstName" FieldName="FirstName" Header="First Name" 
         Width="*" AllowSorting="False"  />
        <mxdg:GridColumn Name="colLastName" FieldName="LastName" Header="Last Name" Width="*"/>
        <mxdg:GridColumn Name="colCity" FieldName="City" Header="City" Width="*" ReadOnly="True" />
        <mxdg:GridColumn Name="colPhone" FieldName="Phone" Header="Phone" Width="*"/>
    </mxdg:DataGridControl.Columns>
</mxdg:DataGridControl>
using Eremex.AvaloniaUI.Controls.DataGrid;

GridColumn colFirstName = new GridColumn() 
 { FieldName = "FirstName", Header = "First Name", AllowSorting = false, 
   Width= new GridLength(1, GridUnitType.Star) };
dataGrid1.Columns.Add(colFirstName);

Автоматическое формирование столбцов

Установите для свойства AutoGenerateColumns значение true (значение по умолчанию - false), чтобы включить автоматическую генерацию столбцов для свойств в источнике данных. Когда для AutoGenerateColumns установлено значение true, контрол DataGrid извлекает публичные свойства из источника данных, генерирует столбцы и привязывает их к свойствам. Если коллекция Columns контрола уже содержит столбец, привязанный к определенному свойству/полю, автоматически не генерируется дополнительный столбец, привязанный к тому же свойству/полю.

События AutoGeneratingColumn и AutoGeneratedColumns позволяют настраивать автоматически сгенерированные столбцы. Событие AutoGeneratingColumn срабатывает, когда автоматически сгенерированный столбец собирается быть добавленным в коллекцию Columns. Установите для параметра события e.Cancel значение true, чтобы предотвратить добавление столбца в коллекцию.

Событие AutoGeneratedColumns срабатывает после того, как все столбцы были автоматически сгенерированы.

Когда вы назначаете контролу другой источник данных, DataGrid сначала удаляет столбцы, которые ранее были сгенерированы автоматически, а затем автоматически генерирует столбцы для нового источника данных.

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

Вы можете применить определенные атрибуты (из пространств имен System.ComponentModel и System.ComponentModel.DataAnnotations) к свойствам бизнес-объекта (записи источника данных), чтобы настроить статус видимости, вид и свойства поведения для соответствующих автоматически сгенерированных столбцов DataGrid. Поддерживаемые атрибуты описаны ниже:

Атрибут Browsable

Атрибут System.ComponentModel.BrowsableAttribute контролирует автоматическую генерацию столбца. Примените атрибут Browsable(false) к определенным свойствам, чтобы предотвратить автоматическое создание соответствующих столбцов.

using CommunityToolkit.Mvvm.ComponentModel;
using System.ComponentModel;

public partial class MyBusinessObject : ObservableObject
{
    [ObservableProperty]
    [property: Browsable(false)]
    public int serviceId = "";
}

Атрибут System.ComponentModel.BrowsableAttribute эквивалентен использованию атрибута System.ComponentModel.DataAnnotations.DisplayAttribute с параметром AutoGenerateField.

Атрибут Display

System.ComponentModel.DataAnnotations.DisplayAttribute - это атрибут общего назначения, который контролирует автоматическую генерацию столбцов и свойства отображения автоматически сгенерированных столбцов. Атрибут имеет следующие параметры, поддерживаемые контролом DataGrid:

  • AutoGenerateField — Указывает, следует ли автоматически генерировать соответствующий столбец.

  • Order — Указывает видимую позицию автоматически сгенерированного столбца (ColumnBase.VisibleIndex).

  • Name — Указывает заголовок автоматически сгенерированного столбца (ColumnBase.Header).

  • ShortName — эквивалентен параметру Name.

  • GroupName — Указывает название диапазона, который будет привязан к автоматически сгенерированному столбцу. Это значение атрибута используется для инициализации свойства GridColumn.BandName, если опцией DataGridControl.AutoGenerateBands является true (по умолчанию).

    Когда Data Grid обнаруживает DisplayAttribute.GroupName, он проверяет наличие существующего диапазона с соответствующим именем (GridBand.BandName). Если такового не существует, контрол автоматически создает диапазон и инициализирует его свойство GridBand.BandName значением DisplayAttribute.GroupName.

    Параметр DisplayAttribute.GroupName также поддерживает вложенные диапазоны. Используйте символ "/" для разделения родительского и дочернего диапазонов (например, "ParentBandName/ChildBandName"). Чтобы включить '/' в качестве литерала, используйте "//".

using CommunityToolkit.Mvvm.ComponentModel;
using System.ComponentModel.DataAnnotations;

public partial class MyBusinessObject : ObservableObject
{
    [ObservableProperty]
    [property: Display(Name = "Birth date", Order=2, GroupName="General")]
    public DateTime? birthdate = null;

    [ObservableProperty]
    [property: Display(GroupName = "Details/Address")]
    public string country { get; set; }

    [ObservableProperty]
    [property: Display(GroupName = "Details/Contact")]
    public string phone { get; set; }
}

Атрибут DisplayName

Атрибут System.ComponentModel.DisplayNameAttribute позволяет вам инициализировать заголовок автоматически сгенерированного столбца (ColumnBase.Header).

using CommunityToolkit.Mvvm.ComponentModel;
using System.ComponentModel;

public partial class MyBusinessObject : ObservableObject
{
    [ObservableProperty]
    [property: DisplayName("Birth date")]
    public DateTime? birthdate = null;
}

Атрибут System.ComponentModel.DisplayNameAttribute эквивалентен использованию атрибута System.ComponentModel.DataAnnotations.DisplayAttribute с параметром Name или ShortName.

Атрибут Editable

Атрибут System.ComponentModel.EditableAttribute, примененный к свойству, создает недоступный для редактирования столбец. Пользователи не могут открывать встроенные редакторы и, таким образом, выделять и копировать текст.

using CommunityToolkit.Mvvm.ComponentModel;
using System.ComponentModel;

public partial class MyBusinessObject : ObservableObject
{
    [ObservableProperty]
    [property: Editable(false)]
    public int parentId = -1;
}

Атрибут Readonly

Атрибут System.ComponentModel.ReadonlyAttribute, применяемый к свойству, создает столбец, доступный только для чтения. Пользователи могут выделять и копировать текст в столбцах, доступных только для чтения, но не редактировать значения.

using CommunityToolkit.Mvvm.ComponentModel;
using System.ComponentModel;

public partial class MyBusinessObject : ObservableObject
{
    [ObservableProperty]
    [property: ReadOnly(true)]
    public int id = -1;
}

Создание столбцов из модели представления

Вы можете заполнить контрол DataGrid столбцами из источника столбцов, определенного в модели представления. Источник столбца - это коллекция бизнес-объектов, из которых генерируются объекты GridColumn в соответствии с указанным шаблоном. Следующие элементы API поддерживают генерацию столбцов из модели представления:

  • DataGridControl.ColumnsSource — Коллекция бизнес-объектов, используемых для генерации столбцов таблицы в соответствии с шаблоном ColumnTemplate.

  • DataGridControl.ColumnTemplate — Шаблон, который инициализирует объект GridColumn из бизнес-объектов, хранящихся в источнике столбцов.

Пример - Генерирование столбцов из источника столбцов

Следующий фрагмент кода из демонстрации "Больших данных" показывает, как вы можете создавать и инициализировать столбцы Data Grid из источника столбцов (DataGridControl.ColumnsSource).

<mxdg:DataGridControl ItemsSource="{Binding Items}" ColumnsSource="{Binding Columns}" AutoGenerateColumns="True" BorderThickness="0,0,1,0"
                      CustomUnboundColumnData="DataGridControl_CustomUnboundColumnData" PropertyChanged="DataGridControl_PropertyChanged">
    <mxdg:DataGridControl.ColumnTemplate>
        <views:DataGridLargeDataViewColumnTemplate/>
    </mxdg:DataGridControl.ColumnTemplate>
</mxdg:DataGridControl>
public class DataGridLargeDataViewColumnTemplate : ITemplate<object, GridColumn>
{
    public GridColumn Build(object param)
    {
        var largeDataColumn = (LargeDataColumn)param;
        var gridColumn = new GridColumn() 
        { 
            FieldName = largeDataColumn.FieldName,
            Header = largeDataColumn.Header
        };
        if (!largeDataColumn.FieldName.Contains("Id"))
        {
            gridColumn.UnboundDataType = largeDataColumn.DataType;

            if (largeDataColumn.FieldName.Contains("ComboBox"))
                gridColumn.EditorProperties = new ComboBoxEditorProperties() { ItemsSource = EmployeesData.EmployeeNames };
            else if (largeDataColumn.FieldName.Contains("Numeric"))
                gridColumn.EditorProperties = new SpinEditorProperties() { MaskType = MaskType.Numeric, Mask = "c" };
        }
        return gridColumn;
    }
}

Полный пример смотрите в демонстрации больших данных для контрола Data Grid.

Перемещение столбцов

Используйте свойство GridColumn.VisibleIndex, чтобы указать визуальную позицию столбца. Чтобы скрыть столбец, установите для его свойства GridColumn.VisibleIndex значение -1 или установите для свойства IsVisible значение false.

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

  • DataGridControl.AllowColumnMoving — Указывает, может ли пользователь перемещать любой столбец.
  • GridColumn.AllowMoving — Указывает, может ли пользователь перемещать определенный столбец.

Изменение размера столбцов

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

  • GridColumn.Width — Ширина столбца, указанная в качестве значения GridLength.
  • GridColumn.MinWidth — Минимальная ширина столбца.
  • GridColumn.MaxWidth — Максимальная ширина столбца.

Свойство Width относится к типу GridLength. Это позволяет вам установить ширину столбца равной:

  • Фиксированная ширина (количество пикселей).
  • Взвешенная доля доступного пространства (обозначение star).
  • Значение "Автоматически" — активирует автоматическое вычисление ширины столбца, подогнанное под заголовок столбца и видимые значения. Когда пользователь прокручивает контрол по вертикали, контрол может увеличить ширину столбца, подгоняя новые значения ячеек, появившиеся во время операции прокрутки.
xmlns:mxdg="https://schemas.eremexcontrols.net/avalonia/datagrid"

<mxdg:DataGridControl Name="dataGrid1">
    <mxdg:DataGridControl.Columns>
        <mxdg:GridColumn Name="colFirstName" FieldName="FirstName" Header="First Name" Width="*"/>
        <mxdg:GridColumn Name="colLastName" FieldName="LastName" Header="Last Name" Width="2*"/>
        <mxdg:GridColumn Name="colPhone" FieldName="Phone" Header="Phone" Width="*"/>
    </mxdg:DataGridControl.Columns>
</mxdg:DataGridControl>

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

  • DataGridControl.AllowColumnResizing — Указывает, может ли пользователь изменять размер любого столбца.
  • GridColumn.AllowResizing — Указывает, может ли пользователь изменять размер определенного столбца.

Заголовки столбцов

Заголовки столбцов DataGrid отображаются на панели заголовков. Вы можете скрыть эту панель с помощью свойства DataGridControl.ShowColumnHeaders.

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

Заголовок столбца изначально отображает заголовок (текстовую метку), который является текстовым представлением свойства ColumnBase.Header. Если свойство ColumnBase.Header не задано, заголовок столбца генерируется из имени поля столбца (ColumnBase.FieldName).

Используйте свойство ColumnBase.HeaderTemplate, чтобы указать шаблон, используемый для отображения заголовка столбца. Шаблон позволяет отображать картинки и пользовательские контролы, а также отображать текст произвольным способом.

Следующий код отображает картинку перед заголовком столбца. Выражение <TextBlock Text="{Binding}"> отображает содержимое свойства Header столбца:

xmlns:mxdg="https://schemas.eremexcontrols.net/avalonia/datagrid"

<mxdg:DataGridControl Name="DataGrid" HeaderPanelMinHeight="50">
    <mxdg:GridColumn FieldName="Number" Header="Position" HeaderVerticalAlignment="Bottom">
        <mxdg:GridColumn.HeaderTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Source="/info24x24.png" Width="24" Height="24" Margin="0,0,5,0"></Image>
                    <TextBlock Text="{Binding}" VerticalAlignment="Center"/>
                </StackPanel>
            </DataTemplate>
        </mxdg:GridColumn.HeaderTemplate>
    </mxdg:GridColumn>
</mxdg:DataGridControl>

Используйте свойства ColumnBase.HeaderHorizontalAlignment и ColumnBase.HeaderVerticalAlignment, чтобы выровнять содержимое заголовка столбца по горизонтали и вертикали.

Сортировка по столбцам

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

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

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

Значения в столбцах

Чтобы узнать, как извлекать значения ячеек для определенных строк, смотрите раздел Строки .

Всплывающие подсказки в заголовке столбца

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

<mxdg:GridColumn FieldName="Position" HeaderToolTip="The job title or role of the employee"/>

grid-columnheadertooltip

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

Смотрите также



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