В данном сценарии значения свойств DataSource и DataMember не устанавливаются. В данном случае в дополнительном меню элемента управления выбирается пункт 'Add Columns…' (рис.).
Рис.
Поскольку источника данных нет (DataSource и DataMember выставлены в null), переключатель 'Databound column' отключен и доступен только переключатель 'Unbound column' и подчиненные ему поля. Задавая значения в этом окне, мы, фактически, задаем следующие свойства новой колонки:
- Имя колонки – это имя создаваемой в форме переменной (тип которой DataGridViewColumn или его наследник), в которую помещается ссылка на добавляемую колонку.
- Тип колонки.
- текст, который будет показан в заголовке данной колонки.
Готовый источник данных, подключаемый во время исполнения
Если свойство DataGridView. AutoGenerateColumns выставлено в true (а по умолчанию так и есть), то во время исполнения любое изменение свойств DataSource / DataMember вызывает генерацию колонок по алгоритму сценария 1. Можно также запустить (перезапустить) этот процесс генерации и добавления, установив упомянутое свойство в false, а потом вернув его в true.
Все колонки (в т.ч. сгенерированные) хранятся в коллекции DataGridViewColumnCollection, а доступ к ней производится через свойство Columns.
Пример
_grid.AutoGenerateColumns = true;
// источник должен содержать не менее 2-х колонок,
// иначе следующая строка выдаст исключение
_grid.DataSource = _biSour;
_grid.Columns[1].Width = 188;
_grid.Columns[1].HeaderText = "MyHeader";
Отсутствие источника данных во время исполнения
В данном случае необходимо составить собственную коллекцию колонок. На первом этапе необходимо определить тип колонок (например, DataGridViewTextBoxColumn).
В С# существуют следующие пути программного добавления колонок:
- Метод Add() коллекции колонок. Этот метод перегружен и позволяет добавлять как готовую колонку (экземпляр класса DataGridViewColumn или его наследника), так и пару «имя – заголовок»:
_grid.Columns.Add("MyColumnName", "MyColumnHeaderText");
_grid.Columns.Add(new DataGridViewColumn(...));
- Просто установить свойство ColumnCountgrid-а в какое-либо значение больше нуля:
_grid.DataSource = null; //если до этого была привязка к источнику
_grid.ColumnCount = 5;
При этом будут созданы колонки, инициализированные значениями по умолчанию (пустыми строками и нулями), но это можно настроить отдельно.
О последнем способе добавления колонок стоит сказать особо. Во-первых, нельзя манипулировать этим свойством, если DataGridView привязан к данным. Поэтому первым шагом необходимо "отвязать" 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);Пример
Рис. Результат работы программы
private void Form1_Load(object sender, EventArgs e)
{
//Формирование заголовка таблицы
this.dataGridView1.ColumnCount = 3;
this.dataGridView1.RowCount = 1;
this.dataGridView1.Columns[0].HeaderText = "№ п/п";
this.dataGridView1.Columns[1].HeaderText = "Значение Х";
this.dataGridView1.Columns[2].HeaderText = "Значение Y";
}
private void textBox2_KeyDown(object sender, KeyEventArgs e)
{
if (!(((e.KeyCode >= Keys.D0) && (e.KeyCode <= Keys.D9)) || (e.KeyCode == Keys.Decimal) || (e.KeyCode == Keys.Add) || (e.KeyCode == Keys.Subtract)))
{
MessageBox.Show("Необходимо вводить числовые значения!");
}
}
private void button1_Click(object sender, EventArgs e)
{ int i,n;
float xn,xk,dx,x,y;
xn=float.Parse(textBox1.Text);
xk=float.Parse(textBox2.Text);
dx=float.Parse(textBox3.Text);
try {
n=(int)((xk-xn)/dx);
for (x = xn, i = 0; x <= xk; x = x + dx, i++)
{
y = (float)(2 * Math.Pow(x, 2) - 5);
string[] row = { i.ToString(), x.ToString(), y.ToString() };
this.dataGridView1.Rows.Add(row);
}
}
catch {
MessageBox.Show("Деление на нуль. Измените значение шага.");
textBox3.Text="";
SelectNextControl(textBox3,true,true,false,false);
}
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (!(((e.KeyCode >= Keys.D0) && (e.KeyCode <= Keys.D9)) || (e.KeyCode == Keys.Decimal) || (e.KeyCode == Keys.Add) || (e.KeyCode == Keys.Subtract)))
{
MessageBox.Show("Необходимо вводить числовые значения!");
}
}