Отсутствие источника данных во время исполнения




В данном случае нет иного выхода, кроме как поработать ручками и составить собственную коллекцию колонок. Первый шаг – определить тип колонок, которые хотелось бы видеть в grid-е. Поскольку колонки всех типов (и встроенные, и пользовательские) добавляются в grid одинаково, в данном разделе будет рассмотрена работа с самым распространенным типом колонки – DataGridViewTextBoxColumn. Работа со всеми прочими типами колонок абсолютно аналогична.

Есть следующие пути программного добавления колонок:

  • Метод Add() коллекции колонок. Этот метод перегружен и позволяет добавлять как готовую колонку (экземпляр класса DataGridViewColumn или его наследника), так и пару «имя – заголовок»:
_grid.Columns.Add("MyColumnName", "MyColumnHeaderText"); _grid.Columns.Add(new DataGridViewColumn(...));
  • Просто установить свойство ColumnCountgrid-а в какое-либо значение больше нуля:
_grid.DataSource = null; //если до этого была привязка к источнику_grid.ColumnCount = 5;

При этом будут созданы колонки, инициализированные значениями по умолчанию (пустыми строками и нулями), но это можно настроить отдельно.

О последнем способе добавления колонок стоит сказать особо. Во-первых, нельзя манипулировать этим свойством, если DataGridView привязан к данным. Поэтому первым шагом необходимо "отвязать" grid от источника, что и делает первая строчка приведенного примера. Но, во-вторых – если записать в это свойство число, меньшее, чем количество уже существующих колонок, то колонки, ставшие "лишними", будут просто отброшены. Причем сначала отбрасывается крайняя правая колонка (речь об экранном представлении), затем предшествующая ей, и так далее, вплоть до самой левой, которая останется в гордом одиночестве, вздумай вы присвоить ColumnCount число, равное единице. Впрочем, никакой трагедии – всегда можно явно указать, какие колонки нужно удалить. Для этого существуют методы Remove и RemoveAt коллекции колонок. Обратите внимание, что вторая строчка примера говорит лишь, что общее количество колонок должно стать равным пяти, а уж надо для этого колонки срезать или добавить, решается в зависимости от ситуации. Таким образом, "игры" с этим свойством могут рассматриваться как "быстрый, но грязный" метод регулировки числа колонок в grid-е. Да, и еще одно применение данного свойства: установка его в ноль эффективно очищает коллекцию колонок. Для этого же можно использовать метод Clear.

Резюме: в данном сценарии программист полностью отвечает за создание новых колонок и за их внесение в коллекцию. Настройка новых колонок также полностью лежит на нем.

Добавляем строки

После добавления колонок логично будет научиться добавлять строки. Сразу договоримся, что в данном разделе строки будут рассматриваться как полоски (bands), объединяющие ячейки. Нас пока интересует не наполнение строк реальным содержимым, а только их создание как независимых объектов с последующим помещением в коллекцию строк. Как вы, возможно, догадались, раз есть коллекция колонок, должна быть и коллекция строк. Действительно, свойство DataGridView. Rows (типа DataGridViewRowCollection) обеспечивает доступ к такой коллекции. Пользуясь им, можно добавить строки в grid. Но в отличие от целых четырех возможных сценариев добавления колонок, в случае добавления строк сценарий всего один. Дело в том, что добавлять строки во время разработки нельзя в принципе, так как свойство Rows помечено атрибутом Browsable(false) и не отображается в PropertyGrid. Добавить строки в DataGridView можно или программно, воспользовавшись методом Add коллекции строк, или подключив к нему некоторый источник данных.

Метод Add() имеет четыре варианта:

// добавляет одну строку, заполняя ее значениями по умолчаниюint Add(); // добавляет одну строку, заполняя ее значениями из массива valuesint Add(params object[] values);// добавляет несколько строк, заполняя их значениями по умолчаниюint Add(int count);// добавляет заранее созданную строкуint Add(DataGridViewRow dataGridViewRow);

DataGridView допускает наличие в одной колонке ячеек разных типов! Что же для этого нужно сделать? Как Для этого сначала объект типа DataGridViewRow должен быть создан и заполнен отдельно. И только затем добавлен в grid. При этом количество колонок в строке должно соответствовать числу колонок grid-а.

Ниже приведен пример добавления переключателя в первую колонку третьей строки:

_grid.DataSource = null; // создадим 3 колонки типа DataGridViewTextBoxColumn _grid.ColumnCount = 3; _grid.Rows.Add();_grid.Rows.Add(); DataGridViewRow newRow = new DataGridViewRow();// Создаем ячейку типа CheckBoxDataGridViewCheckBoxCell checkCell = new DataGridViewCheckBoxCell();checkCell.Value = true;// Добавляем в качестве первой ячейки новой строки ячейку типа CheckBoxnewRow.Cells.Add(checkCell); // Остальные ячейки заполняем ячейками типа TextBoxnewRow.Cells.Add(new DataGridViewTextBoxCell()); newRow.Cells.Add(new DataGridViewTextBoxCell()); // эта строчка будет с переключателем в первой колонке_grid.Rows.Add(newRow);

Другой способ создания разнородных строк или ячеек – воспользоваться методом DataGridViewRow. CreateCells (). Этот метод заполняет экземпляр строки ячейками, считываемыми из экземляра DataGridView, указанного в качестве параметра. У этого метода есть два перегруженных варианта, второй из которых, кроме всего прочего, позволяет задать значения ячеек. Ниже приведен пример, в котором создается новая строка, описание колонок которой считывается из DataGridView, после чего одна из ячеек заменяется другой, с другим типом, после чего строка добавляется в DataGridView:

_grid.DataSource = null; _grid.ColumnCount = 3; DataGridViewRow heter_row = new DataGridViewRow();// создаем строку, считывая описания колонок с _gridheter_row.CreateCells(_grid);// удаляем вторую ячейкуheter_row.Cells.RemoveAt(1); // и добавляем вместо нее комбинированный списокheter_row.Cells.Insert(1, new DataGridViewComboBoxCell()); // добавляем модифицированную строку _grid.Rows.Add(heter_row);

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



Поделиться:




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

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


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