Содержание
Элемент DataGrid
предназначен для отображения табличных данных и по внешнему виду чем-то похож на ListView
, однако обладает более развитыми возможностями по настройке и управлению данными. Обычно, этот элемент управления WPF применяется для отображения данных полученных из какого-либо источника, например, из базы данных, но его можно использовать и для отображения обычных списков объектов типа List<T>
.
DataGrid
, не затрагивая вопросы использования свойств и событий родительских классов, таких как ItemsControl
и Selector
. Поэтому, прежде, чем приступать к изучению этого материала, ознакомьтесь с этой частью руководства в которой рассмотрены основные моменты по работе со списками элементов в WPF в принципе.Элемент DataGrid: иерархия классов
Элемент управления DataGrid содержит все свойства и события присущие наследникам классов ItemControl
и Selector
и наследуется от ещё одного класса для работы со списками — MultiSelector
Класс 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
используется сортировка значений. Рассмотрим другие свойства DataGrid
, которые мы можем использовать для настройки внешнего вида таблицы.
Свойства элемента DataGrid
Элемент DataGrid
предоставляет нам достаточно много собственных свойств, отвечающих как за внешний вид таблицы, так и за функциональность элемента управления. Ниже будут рассмотрены только основные свойства DataGrid
, которые мы можем применить уже сейчас.
Свойство | Тип | Описание |
AlternatingRowBackground |
Brush |
Определяет кисть фона для использования в чередующихся строках |
AutoGenerateColumns |
bool |
Определяет следует ли автоматически создавать столбцы таблицы |
CanUserReorderColumns |
bool |
Определяет может ли пользователь менять расположение столбцов |
CanUserResizeColumns |
bool |
Определяет может ли пользователь менять ширину столбцов таблицы |
CanUserResizeRows |
bool |
Определяет может ли пользователь менять высоту строк |
CanUserSortColumns |
bool |
Определяет может ли пользователь сортировать записи таблицы, кликая по заголовку столбца |
ColumnHeaderHeight |
double |
Задает высоту заголовков столбцов |
GridLinesVisibility |
DataGridGridLinesVisibility |
Определяет видимость линий таблицы. Может принимать следующие значения:
|
HorizontalGridLinesBrush |
Brush |
Задает кисть для горизонтальных линий сетки |
RowBackground |
Brush |
Фон строки. Если задано свойство AlternatingRowBackground , то цвет этой кисти применяется только для нечетных строк |
VerticalGridLinesBrush |
Brush |
Задает кисть для вертикальных линий сетки |
VerticalScrollBarVisibility |
ScrollBarVisibility |
Определяет видимость вертикальной полосы прокрутки в таблице и может принимать следующие значения:
|
Columns |
ObservableCollection<System.Windows.Controls.DataGridColumn> |
Определяет набор столбцов таблицы |
Воспользуемся некоторыми из этих свойств и изменим код XAML нашего объекта DataGrid
следующим образом:
<DataGrid x:Name="grid" AutoGenerateColumns="True" AlternatingRowBackground="LightBlue" CanUserReorderColumns="True" CanUserResizeRows="True" GridLinesVisibility="Vertical"> </DataGrid>
Теперь наша таблица будет выглядеть следующим образом:
Одним из наиболее интересных и полезных свойств 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 }, };
Теперь запустим приложение и посмотрим на результат:
Иногда нам бывает необходимо не показать, а наоборот — скрыть данные объекта от пользователя. Один из способов это сделать — определить обработчик события 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, как привязка данных и работа с командами. Когда мы изучим эти темы — вернитесь к DataGrid
ещё раз, чтобы расширить свои знания и возможности по работе с этим элементом управления.