Чаще всего данные попадают в DataGridView из подключенного источника данных. При этом встроенный механизм Windows Forms Data Binding автоматически заполняет каждую ячейку значением из соответствующей ячейки источника. Но, как вы уже знаете, новый control поддерживает также специальный режим отображения «свободных» (не привязанных, unbound) данных. Кроме того, поддерживается комбинированный режим одновременного отображения связанных и свободных данных.
Немного терминологии для начала... Свободными данными называются данные, заносимые в ячейки вручную. Связанными данными называются данные, заносимые в ячейки автоматически из привязанного источника данных. Будут ли данные считаться связанными или свободными, определяется на уровне колонок.
Колонка становится связанной, если в ее свойство DataGridViewColumn.DataPropertyName (типа string) заносится название колонки или свойства объекта из источника данных. Колонка считается свободной, если упомянутое свойство становится равным пустой строке.
Если свойство AutoGenerateColumns выставлено в true, DataGridView не только генерирует новый список колонок при подключении источника данных, но и привязывает эти колонки к колонкам или свойствам источника данных.
Однако это не означает, что нельзя управлять привязкой колонок после их автоматического формирования. Разберем следующий пример. Допустим, у нас есть две простые таблицы (рисунок 10).
Рисунок 10.
ПРИМЕЧАНИЕ В ближайшем примере будет задайствована только первая таблица – MyTbl1. Вторая будет задействована позже. |
Следующий код подключает MyTbl1 к grid-у через BindingSource и, в демонстрационных целях, удаляет колонку City1:
_grid.DataSource = this.myTbl1BindingSource;_grid.Columns.RemoveAt(2); |
При этом остается две привязанные колонки, заполненные данными из БД:
|
Рисунок 11.
Теперь добавим третью колонку:
_grid.Columns.Add("additionalColumn", "FreeForStart"); |
и получим смешанный режим: две привязанные и одна свободная колонка:
Рисунок 12.
Наконец, привяжем только что созданную колонку grid-а к колонке из источника данных:
_grid.Columns["additionalColumn"].DataPropertyName = "City1"; |
Это опять создаст ситуацию, когда все колонки привязаны. Но на этот раз их три:
Рисунок 13.
Допустим, свободные колонки у нас есть. А как теперь работать с их ячейками? Другими словами – как добраться до конкретной ячейки grid-а и ее содержимого? Для этого нужно обратиться к индексатору Rows[], получить ссылку на конкретную строку (DataGridViewRow), а уже в ней, обратясь к индексатору Cells[] – ссылку на интересующую нас ячейку. Единственное, что надо учесть – ссылка будет иметь тип DataGridViewCell, а мы, чаще всего, будем заинтересованы в функциональности, присущей не любой ячейке вообще, а ячейке именно того или иного типа. Поэтому извлечение ячейки из коллекции практически всегда завершается приведением типа. Вернитесь к разделу "Добавляем строки" и еще раз посмотрите последний фрагмент кода. В нем мы создали grid 3х3, в котором все ячейки текстовые, за исключением ячейки с индексом 1 в строке с индексом 2 (2:1, далее для краткости будет использоваться такая запись). Указанная ячейка имеет тип DataGridViewComboBoxCell. Чтобы заполнить ее список четырьмя элементами, можно написать следующее:
DataGridViewComboBoxCell comboCell = (DataGridViewComboBoxCell)_grid.Rows[2].Cells[1];//наполняем.....comboCell.Items.AddRange(new string[] { "VS2003", "VS2005", "MSDN", "RSDN" }); |
Упомянутое приведение типов в этом примере выделено красным.
|
Доступ к значению ячейки в общем случае осуществляется через свойство Value. Тип этого свойства – object. Реальный тип значения полностью зависит от типа ячейки. Например, в предпоследнем фрагменте раздела "Добавляем строчки" кода мы работали с ячейкой типа DataGridViewCheckBoxCell и присваивали этому свойству значения типа bool. А DataGridViewTextBoxCell будет работать, что вполне ожидаемо, со строками. Вот как можно занести значение "Great!" в четвертую строку колонки "FreeForStart" из приведенного чуть выше примера:
DataGridViewTextBoxCell txtCell = (DataGridViewTextBoxCell)_grid.Rows[4].Cells[2];txtCell.Value = "Great!"; |
В данном случае приведение типов избыточно, так как свойство Value есть у базового класса DataGridViewCell. Результат этого примера приведен на рисунке 14.
Рисунок 14.
У пытливых читателей статьи может возникнуть вопрос – а если попытаться манипулировать содержимым ячейки привязанной колонки? Так вот – привязка вовсе не запрещает разработчику менять содержимое ячеек по своему усмотрению. Следующий код работает как часы:
DataGridViewCell txtCell2 = _grid.Rows[2].Cells[1]; //первая колонка привязанная!txtCell2.Value = "Also good!"; |
Рисунок 15.
При этом изменение значения ячейки отражено в привязанном источнике данных. Свойству Value можно присвоить не только строку, но и все, что может быть сконвертировано в строку.