Шесть типов встроенных колонок




В приведенной в начале статьи схеме иерархии классов показано, что все колонки имеют одного предка – класс DataGridViewColumn. У этого класса есть важное свойство – CellTemplate типа DataGridViewCell. Это свойство (чаще всего его значение задают через перегруженный конструктор DataGridViewColumn(DataGridViewCell cellTemplate)) определяет, ячейки какого типа будут генерироваться при добавлении строк. Но установка этого свойства всего лишь определит, что именно генерировать автоматически при добавлении новой строки, и вовсе не запретит колонке иметь в своем составе ячейки других типов.

По сути, классы, производные от DataGridViewColumn просто передают своему базовому классу соответствующие значения свойства CellTemplate. Кроме того, эти производные классы задают значения ряда дополнительных свойств.

СОВЕТ При создании ячейки собственного типа унаследуйте ее класс от DataGridViewCell и присваивайте ему имя вида DataGridView<ваш_тип>Cell. Одновременно с этим не забудьте унаследовать от DataGridViewColumn еще один класс с именем DataGridView<ваш_тип>Column.

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

Давайте сразу же обратимся к коду короткого примера:

using System;using System.ComponentModel;using System.Data;using System.Windows.Forms;using System.Drawing; public class Form1: Form{ public Form1() { DataGridView _grid = new DataGridView(); _grid.Dock = DockStyle.Fill; _grid.AllowUserToAddRows = false; Controls.Add(_grid); _grid.Columns.Add(new DataGridViewTextBoxColumn()); _grid.Columns[0].HeaderText = "TextBoxColumn"; _grid.Columns.Add(new DataGridViewLinkColumn()); _grid.Columns[1].HeaderText = "LinkColumn"; _grid.Columns.Add(new DataGridViewButtonColumn()); _grid.Columns[2].HeaderText = "ButtonColumn"; _grid.Columns.Add(new DataGridViewCheckBoxColumn()); _grid.Columns[3].HeaderText = "CheckBoxColumn"; _grid.Columns.Add(new DataGridViewComboBoxColumn()); _grid.Columns[4].HeaderText = "ComboBoxColumn"; _grid.Columns.Add(new DataGridViewImageColumn()); _grid.Columns[5].HeaderText = "ViewImageColumn"; _grid.Rows.Add(); for (int i = 0; i <= 3; i++) { DataGridViewRow heter_row = new DataGridViewRow(); for (int j = 0; j < _grid.Columns.Count; j++) heter_row.Cells.Add(new DataGridViewTextBoxCell()); switch (i) { case 0: heter_row.HeaderCell.Value = "Value"; break; case 1: heter_row.HeaderCell.Value = "ValueType"; break; case 2: heter_row.HeaderCell.Value = "FormattedValue"; break; case 3: heter_row.HeaderCell.Value = "FormattedValueType"; break; } _grid.Rows.Add(heter_row); } // Заполнение строки 0 DataGridViewRow row0 = _grid.Rows[0]; row0.HeaderCell.Value = "Внешний вид ячейки"; DataGridViewTextBoxCell cell0 = (DataGridViewTextBoxCell)row0.Cells[0]; cell0.Value = "dotNET"; DataGridViewLinkCell cell1 = (DataGridViewLinkCell)row0.Cells[1]; cell1.Value = "RSDN.ru"; DataGridViewButtonCell cell2 = (DataGridViewButtonCell)row0.Cells[2]; cell2.Value = "Accept"; DataGridViewCheckBoxCell cell3 = (DataGridViewCheckBoxCell)row0.Cells[3]; cell3.Value = true; DataGridViewComboBoxCell cell4 = (DataGridViewComboBoxCell)row0.Cells[4]; cell4.Items.AddRange(new string[] { "Trace", "Debug", "Release" }); cell4.Value = "Release"; DataGridViewImageCell cell5 = (DataGridViewImageCell)row0.Cells[5]; cell5.ImageLayout = DataGridViewImageCellLayout.Zoom; cell5.Value = Image.FromFile(@"C:\WINDOWS\Blue Lace 16.bmp"); // Заполнение строки 1 for (int j = 0; j < _grid.Columns.Count; j++) _grid.Rows[1].Cells[j].Value = _grid.Rows[0].Cells[j].Value.ToString(); // Заполнение строки 2 for (int j = 0; j < _grid.Columns.Count; j++) _grid.Rows[2].Cells[j].Value = _grid.Rows[0].Cells[j].ValueType.ToString(); // Заполнение строки 3 for (int j = 0; j < _grid.Columns.Count; j++) _grid.Rows[3].Cells[j].Value = _grid.Rows[0].Cells[j].FormattedValue.ToString(); // Заполнение строки 4 for (int j = 0; j < _grid.Columns.Count; j++) _grid.Rows[4].Cells[j].Value = _grid.Rows[0].Cells[j].FormattedValueType.ToString(); }}

Результат исполнения этого кода показан на рисунке 17.


Рисунок 17.

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

Метка строки Что показывает
Value Реальный объект, лежащий в ячейке на момент отрисовки последней. К этому объекту может быть применено автоматическое форматирование и конвертирование типа, если тип значения, записываемого в это свойство, отличается от типа, ожидаемого ячейкой.
ValueType Тип объекта, хранящегося в ячейке.
FormattedValue Значение, полученное после форматирования или конвертирования.
FormattedValueType Тип значения, полученного после форматирования или конвертирования

Таблица 2.

Ну вот, все готово для анализа и описания каждого из типов ячеек, используемых во встроенных колонках.

DataGridViewTextBoxCell

В ячейке этого типа может содержаться любой объект, имеющий разумную реализацию метода ToString().

Об этих ячейках и колонках уже, пожалуй, сказано вполне достаточно. Еще раз напомню, что именно они являются типом, используемым DataGridView по умолчанию. Если ячейка данного типа не является доступной только для чтения, и пользователь инициирует её редактирование (нажатием F2 или щелчком мыши), то внутрь ячейки помещается экземпляр control-а типа DataGridViewTextBoxEditingControl, которому передается текущее значение ячейки, на который и ложится вся функциональность редактирования "по месту". Этот control является наследником обычного TextBox и реализует интерфейс IDataGridViewEditingControl. Этот интерфейс должны реализовывать все редакторы, используемые в DataGridView.

Пока ячейка находится в режиме редактирования, ее значение не меняется, а редактор работает с его локальной копией. От него в любой момент можно отказаться, просто нажав на ESC. После ухода фокуса из такой редактируемой ячейки DataGridViewTextBoxEditingControl отбрасывается и происходит одно из двух:

  • в обычном, не виртуальном режиме генерируется событие DataGridView.CellParsing поднимается и транзитные данные (точнее – бывшие транзитные, т.к. к этой точке они этот статус уже потеряли) "вталкиваются" в подлежащий источник данных;
  • если grid в виртуальном режиме - событие DataGridView.CellValuePushed поднимается (помните, мы работали с ним в предыдущем разделе?) и мы вольны поступать с новыми данными так, как сочтем нужным. Чаще всего мы будет их записывать в локальный кэш виртуального режима.

DataGridViewLinkColumn

DataGridViewLinkColumn – это тип колонка, ячейки которой содержат ссылки. Это полезно при выводе значений URL или как альтернатива кнопке.

Этот тип колонок не генерируется автоматически при связывании данных, такие колонки приходится создавать вручную и вручную же привязывать к данным.

Для обработки щелчка по ссылке нужно создать и подключить обработчик события CellContentClick grid-а. В этом событии передаются только координаты ячейки, так что сами данные придется добывать вручную.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-09-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: