Отсутствие источника данных в дизайн-тайм




В данном сценарии значения свойств 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("Необходимо вводить числовые значения!");

}

}



Поделиться:




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

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


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