Меню Закрыть

Datagrid wpf c примеры

Содержание

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

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

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

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

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

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

RowBackground и AlternatingRowBackground

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

ColumnHeaderHeight

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

RowHeaderWidth

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

ColumnWidth

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

RowHeight

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

Читайте также:  Plf plr csf csr uma

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 (в коде):

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

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

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

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

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

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

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

Читайте также:  Intel pentium g6950 характеристики

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

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

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

Управление отображением строки деталей

Используя свойство RowDetailsVisibilityMode, Вы можете изменять поведение вышеупомянутого механизма. По умолчанию оно определено как VisibleWhenSelected, в этом случае строка деталей будет видна исключительно при выбранной строке-родителе. Вы можете изменить это свойство на Visible или Collapsed. Если выбрать Visible, то все строки с деталями будут видны всегда, как здесь:

Больше деталей

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

Читайте также:  15000 Мегабайт сколько гигабайт

В итоге

Возможность представлять детали в строке DataGrid является крайне полезной, а в WPF использование этого механизма является простым, а так же DataGrid позволяет кастомизировать данные, что Вы наверняка заметили в примерах выше.

Не так давно мне потребовалось использовать таблицу в приложении на C#. По наивности я подумал, что буду использовать всё самое свежее и выбрал для проекта WPF вместо WinForm и, конечно, взял самый свежий .net framework 4.5. Тут-то и начались проблемы. Как всегда, я решил, что в Яндексе найдётся всё, но не тут то было — в интернете (вернее в РУнете) вообще ничего о DataGrid нет. Постоянно, как бы хитро не изменял запросы, я попадал на DataGridView из WinForm. Самое интересное в том, что платформа WPF полностью переработана и многое из того, что работало в WinForm в WPF не работает вообще никак.

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

После продолжительного негодования я открыл большую и толстую книгу по WPF. И вот, чудо! Там было всё, как изменить размер, переименовать и перекрасить что угодно и как угодно, но о том, как элементарно достать запись из DataGrid не было и слова.

Отчаявшись, я решил было перейти на WinForm, но вспомнив старую добрую пословицу «если программа не работает, то проблема не в коде, а в программисте», решил разобраться в проблеме и (правда не помню на каком сайте) нашёл решение (это был сайт на английском языке в самых чёрных глубинах интернета). Название сайта вспомнил, ссылка в конце документа.

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

После этого заполним таблицу с помощью события Loaded:

После всего получим информацию о строчке по событию MouseUp (клик мышкой):

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

Скриншот того, что получилось:

Для примера использован Visual Studio 2012 и .net 4.0.

«>

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.