DataGrid

57

DataGrid представляет собой элемент управления отображением данных, который извлекает информацию из коллекции объектов и визуализирует ее в сетке со строками и ячейками. Каждая строка соответствует отдельному объекту, а каждый столбец — свойству в этом объекте.

Элемент управления DataGrid привносит столь необходимое разнообразие в возможности для работы с данными в WPF. Его модель столбцов предоставляет замечательную гибкость в плане форматирования. Его модель выбора позволяет разрешать пользователям выбирать одну строку, множество строк или некоторую комбинацию ячеек. Его поддержка редактирования является достаточно мощной для того, чтобы DataGrid можно было использовать в качестве универсального редактора для простых и сложных данных. Для создания элемента управления DataGrid на скорую руку можно пользоваться функцией автоматической генерации столбцов. Для этого необходимо установить свойство AutoGenerateColumns в true (значение по умолчанию):

<DataGrid x: Name="gridProducts " AutoGenerateColumns="True">
</DataGrid>

Затем DataGrid можно заполнить данными установкой свойства ItemsSource:

gridProducts.ItemsSource = products;

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

DataGrid с автоматически сгенерированными столбцами

При отображении нестроковых свойств в элементе управления DataGrid вызывается метод ToString(), который прекрасно работает для чисел, дат и других простых типов данных, но не столь же хорошо для более сложных объектов данных. (В данном случае имеет смысл определить столбцы явно, поскольку такой подход предоставляет возможность привязываться к подсвойству, использовать конвертер значений и применять шаблон для получения корректно отображаемого содержимого.)

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

RowBackground и AlternatingRowBackground

Кисть, которая используется для закрашивания фона позади каждой строки (RowBackground), и фон чередующихся строк (AlternatingRowBackground). По умолчанию в DataGrid строкам с нечетными номерами назначается белый фон, а строкам с четными номерами — светло-серый фон

ColumnHeaderHeight

Высота (в независимых от устройства единицах) строки, отображающей заголовки столбцов в верхней части DataGrid

RowHeaderWidth

Ширина (в независимых от устройства единицах) столбца, содержащего заголовки строк. Этот столбец находится в самом левом углу сетки, где данные не отображаются. Он указывает на строку, которая является выбранной в текущий момент (посредством стрелки), и показывает, находится ли она в режиме редактирования (с помощью стрелки внутри круга)

ColumnWidth

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

RowHeight

Высота каждой строки. Этот параметр полезен в случае, если в DataGrid планируется отображать множество строк текста или какое-то другое содержимое (такое как рисунки). В отличие от столбцов, строки не могут изменяться в размере пользователем

GridLinesVisibility

Значение из перечисления DataGridGridlines, которое указывает, какие линии должны отображаться в сетке (Horizontal, Vertical, None, All)

VerticalGridLinesBrush

Кисть, которая используется для закрашивания линий сетки, отображаемых между столбцами

HorizontalGridLinesBrush

Кисть, которая используется для закрашивания линий сетки, отображаемых между строками

HeadersVisibility

Значение из перечисления DataGridHeaders, которое указывает, какие заголовки должны отображаться (Column, Row, All, None)

HorizontalScrollBarVisibility и VerticalScrollBarVisibility

Значение из перечисления ScrollBarVisibility, которое указывает, должна ли полоса прокрутки отображаться только при необходимости (Auto), всегда (Visible) или никогда (Hidden). По умолчанию оба свойства установлены в Auto

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

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

Для установки свойства ColumnWidth передается объект DataGridLength. В этом объекте можно указать точный размер (в независимых от устройства единицах) или задать специальный режим установки размера, предусматривающий самостоятельное выполнение элементом управления DataGrid некоторой работы. Точный размер устанавливается в свойстве ColumnWidth (в XAML-разметке) или передается в виде одного из аргументов конструктора при создании объекта DataGridLength (в коде):

grid.ColumnWidth = new DataGridLength(150);

Специальные режимы задания размеров более интересны. Доступ к ним осуществляется через статические свойства класса DataGridLength. Ниже приведен пример применения выбираемого по умолчанию режима DataGridLength.SizeToHeader, который означает, что столбцы должны делаться настолько широкими, чтобы в них умещался текст заголовков:

grid.ColumnWidth = DataGridLength.SizeToHeader;

Другим популярным вариантом является режим DataGridLength.SizeToCells, при котором каждый столбец делается широким настолько, чтобы в нем умещалось самое широкое значение из тех, которые видны в текущий момент.

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

Еще одним доступным специальным режимом является DataGridLength.Auto. Он работает точно так же, как DataGridLength.SizeToCells, но предусматривает расширение столбца таким образом, чтобы в нем умещалось самое большое отображаемое значение или текст заголовка столбца, в зависимости от того, что из них шире.

DataGrid также позволяет использовать систему пропорционального изменения размеров, которая похожа на систему установки размеров с помощью звездочки, применяемую в панели компоновки Grid. Символ звездочки (*) представляет пропорциональное изменение размеров, а предшествующее ему число - коэффициент, который должен использоваться для разделения доступного пространства (например, чтобы выделить первому столбцу в два раза больше пространства, чем второму, необходимо указать 2* и *).

Для настройки такого соотношения или указания для столбцов разных значений ширины или разных режимов определения размеров необходимо явно устанавливать свойство Width для каждого объекта столбца.

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

Естественно, заставлять пользователей возиться с нелепо широкими столбцами — не очень хорошая идея. По этой причине для каждого столбца может понадобиться указать вручную свою ширину или другой режим задания размеров. Для этого нужно явно определить столбцы и установить для них свойство DataGridColumn.Width. Значение, указанное в этом свойстве для столбца, переопределяет значение DataGrid.ColumnWidth, используемое по умолчанию.

Обычно пользователи могут изменять размеры столбцов, перетаскивая их края в направлении нужного размера. Чтобы отключить эту возможность, необходимо установить свойство CanUserResizeColumns в false. Чтобы запретить изменять размеры определенного столбца, понадобится установить его свойство CanUserResize в false. Установка свойства MinWidth этого столбца позволяет задать минимально допустимую ширину для столбца.

Элемент управления DataGrid также позволяет пользователям настраивать отображение столбцов. Можно не только изменять размеры столбцов, но и перетаскивать их из одной позиции в другую. Чтобы отключить возможность изменения порядка следования столбцов, необходимо установить в false свойство CanUserReorderColumns элемента DataGrid или свойство CanUserReorder конкретного столбца.

Пройди тесты
Лучший чат для C# программистов