Элементы управления в WPF. Элемент DataGrid

Элемент DataGrid предназначен для отображения табличных данных и по внешнему виду чем-то похож на ListView, однако обладает более развитыми возможностями по настройке и управлению данными. Обычно, этот элемент управления WPF применяется для отображения данных полученных из какого-либо источника, например, из базы данных, но его можно использовать и для отображения обычных списков объектов типа List<T>.

Здесь мы рассмотрим возможности, которые нам предоставляет именно элемент DataGrid, не затрагивая вопросы использования свойств и событий родительских классов, таких как ItemsControl и Selector. Поэтому, прежде, чем приступать к изучению этого материала, ознакомьтесь с этой частью руководства в которой рассмотрены основные моменты по работе со списками элементов в WPF в принципе.

Элемент DataGrid: иерархия классов

Элемент управления DataGrid содержит все свойства и события присущие наследникам классов ItemControl и Selector и наследуется от ещё одного класса для работы со списками — MultiSelector

Элемент DataGrid в WPF и C#

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

Свойство Тип Описание
CanSelectMultipleItems bool Определяет можно ли выбирать несколько элементов списка за один раз
IsUpdatingSelectedItems bool Указывает, выполняет ли MultiSelector в настоящее время массовое обновление коллекции SelectedItems (свойство только для чтения).
SelectedItems IList Возвращает список выбранных элементов

Для программного выбора элементов в списке, MultiSelector определяет два метода:

  • public void SelectAll();— выбирает все элементы в списке
  • public void UnselectAll();— отменяет выбор всех элементов

 

Элемент DataGrid

Для начала, попробуем создать новый DataGrid, заполнив его какими-либо объектами, как мы это делали при рассмотрении ListView. Добавим в проект класс

public class Person
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }
}

изменим код класса MainWindow 

public partial class MainWindow : Window
{
    private readonly List<Person> _people;
    public MainWindow()
    {
        _people = new List<Person>()
    {
        new Person(){Name="Иван", Surname="Иванов", Age=18 },
        new Person(){Name="Петров", Surname="Пётр", Age=25 },
        new Person(){Name="Семенов", Surname="Семён", Age=26 },
    };


        InitializeComponent();
        grid.ItemsSource = _people;
    }
}

и добавим в разметку XAML следующий объект DataGrid:

<Window x:Class="WpfApp6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp6"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DataGrid x:Name="grid" AutoGenerateColumns="True"> 
            
        </DataGrid>
    </Grid>
</Window>

Обратите внимание на то, что наш DataGrid не содержит никаких вложенных объектов, а также на свойство AutoGenerateColumns, которое указывает нам, что столбцы DataGrid должны генерироваться автоматически, исходя из типа объектов, переданных в свойстве ItemSource. Такой код позволит создать объект DataGrid следующего вида:

Элемент DataGrid в WPF и C#

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

Свойства элемента DataGrid

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

Свойство Тип Описание
AlternatingRowBackground Brush Определяет кисть фона для использования в чередующихся строках
AutoGenerateColumns bool Определяет следует ли автоматически создавать столбцы таблицы
CanUserReorderColumns bool Определяет может ли пользователь менять расположение столбцов
CanUserResizeColumns bool Определяет может ли пользователь менять ширину столбцов таблицы
CanUserResizeRows bool Определяет может ли пользователь менять высоту строк
CanUserSortColumns bool Определяет может ли пользователь сортировать записи таблицы, кликая по заголовку столбца
ColumnHeaderHeight double Задает высоту заголовков столбцов
GridLinesVisibility DataGridGridLinesVisibility Определяет видимость линий таблицы. Может принимать следующие значения:

  • All — видимы как горизонтальные, так и вертикальные линии сетки.
  • Horizontal — видимы только горизонтальные линии сетки.
  • None — линии сетки невидимы.
  • Vertical — видимы только вертикальные линии сетки.
HorizontalGridLinesBrush Brush Задает кисть для горизонтальных линий сетки
RowBackground Brush Фон строки. Если задано свойство AlternatingRowBackground, то цвет этой кисти применяется только для нечетных строк
VerticalGridLinesBrush Brush Задает кисть для вертикальных линий сетки
VerticalScrollBarVisibility ScrollBarVisibility Определяет видимость вертикальной полосы прокрутки в таблице и может принимать следующие значения:

  • Auto — полоса прокрутки отображается автоматически, когда окно просмотра не может отобразить все содержимое.
  • Disabled полоса прокрутки не отображается, даже если окно просмотра не может показать все содержимое.
  • Hidden полоса прокрутки не отображается, даже если окно просмотра не может показать все содержимое.
  • Visible полоса прокрутки всегда отображается.
Columns ObservableCollection<System.Windows.Controls.DataGridColumn> Определяет набор столбцов таблицы

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

<DataGrid x:Name="grid" 
          AutoGenerateColumns="True"
          AlternatingRowBackground="LightBlue"
          CanUserReorderColumns="True"
          CanUserResizeRows="True"
          GridLinesVisibility="Vertical"> 
    
</DataGrid>

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

Элемент DataGrid в WPF и C#

Одним из наиболее интересных и полезных свойств DataGrid является свойство Columns, которое позволяет вручную настраивать столбцы таблицы и их тип. Рассмотрим это свойство более подробно.

Работа со столбцами DataGrid

По умолчанию DataGrid автоматически создает столбцы при установке свойства ItemsSource. Тип создаваемого столбца зависит от типа данных в столбце. На данный момент, WPF предоставляет нам следующие типы столбцов DataGrid:

Тип созданного столбца Тип данных
DataGridTextColumn String
DataGridCheckBoxColumn Boolean
DataGridComboBoxColumn Enum
DataGridHyperlinkColumn Uri

Для примера, изменим класс Person в нашем проекте следующим образом:

public class Person
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }
    public bool IsMarried { get; set; }
    public Uri HomePage { get; set; } = new Uri("http://csharp.webdelphi.ru");
}

также изменим инициализацию списка в конструкторе MainWindow:

    _people = new List<Person>()
{
    new Person(){Name="Иван", Surname="Иванов", Age=18, IsMarried=false },
    new Person(){Name="Петров", Surname="Пётр", Age=25, IsMarried=true },
    new Person(){Name="Семенов", Surname="Семён", Age=26, IsMarried=false },
};

Теперь запустим приложение и посмотрим на результат:

Элемент DataGrid в WPF и C#

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

<DataGrid x:Name="grid" 
          ....
          AutoGeneratingColumn="grid_AutoGeneratingColumn"> 
    
</DataGrid>
private void grid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyName == "Age")
        e.Cancel = true;
}

В обработчике события мы проверяем свойство PropertyName аргументов события, которое содержит имя свойства для которого создается объект и присваиваем свойству  Cancel значение true для того, чтобы отменить создание столбца. Таким образом, сейчас в нашей таблице не будет показываться столбец Age. Здесь же мы можем получить доступ и к объекту создаваемого столбца, чтобы провести его более тонкую настройку, например, изменить его заголовок:

private void grid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    ...
    if (e.PropertyName == "IsMarried")
        e.Column.Header = "Женат";
}

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

Элемент DataGrid в WPF и C#

Итого

Элемент DataGrid позволяет отображать данные в виде таблицы, полученные из различных источников. Этот элемент управления обладает широкими возможностями по работе с данными и, стоит отметить, что сейчас мы рассмотрели только малую их часть. По настоящему всю мощь этого элемента управления можно проверить в действии после изучения таких вопросов WPF, как привязка данных и работа с командами. Когда мы изучим эти темы — вернитесь к DataGrid ещё раз, чтобы расширить свои знания и возможности по работе с этим элементом управления.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии