В Windows Forms табличные данные удобно выводить с помощью элемента управления DataGridView. В статье покажем, как это сделать на примере таблицы из базы данных и языка программирования C#.
Исходные данные для DataGridView
Имеется таблица в базе данных Microsoft SQL Server с информацией о факультетах университета.
Эти данные будем выводить в элемент DataGridView, расположенный на Windows Forms.
Программа с DataGridView
Создадим новый проект Windows Forms на Visual C# в Visual Studio. На форме расположим элемент управления DataGridView — для этого перетащите его с «Панели элементов» на макет окна.
Добавим в DataGridView три столбца под три соответствующих колонки из таблицы БД с помощью кнопки «Правка столбцов».
Для наглядности назовём их так же, как называются поля в таблице базы данных.
Переходим к написанию кода. Вся функциональность по чтению данных из БД и их последующему выводу в DataGridView реализована в методе LoadData().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); LoadData(); } private void LoadData() { string connectString = «Data Source=.\\SQLEXPRESS;Initial Catalog=LSTU_Schedule_autumn20172018;» + «Integrated Security=true;»; SqlConnection myConnection = new SqlConnection(connectString); myConnection.Open(); string query = «SELECT * FROM Faculty ORDER BY fac_id»; SqlCommand command = new SqlCommand(query, myConnection); SqlDataReader reader = command.ExecuteReader(); List<string[]> data = new List<string[]>(); while (reader.Read()) { data.Add(new string[3]); data[data.Count — 1][0] = reader[0].ToString(); data[data.Count — 1][1] = reader[1].ToString(); data[data.Count — 1][2] = reader[2].ToString(); } reader.Close(); myConnection.Close(); foreach (string[] s in data) dataGridView1.Rows.Add(s); } } |
Разберём подробно код на C#.
Объявление переменной со строкой подключения к базе данных:
string connectString = «Data Source=.\\SQLEXPRESS;Initial Catalog=LSTU_Schedule_autumn20172018;» + «Integrated Security=true;»; |
Создание объекта для подключения к БД:
SqlConnection myConnection = new SqlConnection(connectString); |
Соединение с БД:
Запрос на получение данных из таблицы с факультетами:
string query = «SELECT * FROM Faculty ORDER BY fac_id»; |
Создание объекта, выполняющего запрос к БД:
SqlCommand command = new SqlCommand(query, myConnection); |
Получение объекта для чтения данных из БД, содержащих несколько строк и столбцов:
SqlDataReader reader = command.ExecuteReader(); |
Создание списка List для хранения полученных данных. Каждая строка будет представлена элементом списка, а столбец — элементом строкового массива string[]:
List<string[]> data = new List<string[]>(); |
В цикле построчно читаем данные строки (каждого её столбца), предварительно создав новый элемент списка List:
while (reader.Read()) { data.Add(new string[3]); data[data.Count — 1][0] = reader[0].ToString(); data[data.Count — 1][1] = reader[1].ToString(); data[data.Count — 1][2] = reader[2].ToString(); } |
Закрываем SqlDataReader:
Разрываем соединение с базой данных:
В цикле foreach добавляем новые строки в DataGridView с помощью метода Add. Элементами строки являются столбцы, заполняемые из строкового массива, содержащегося в конкретном элементе списка List:
foreach (string[] s in data) dataGridView1.Rows.Add(s); |
Запустим программу и посмотрим её в работе.
Если у Вас остались какие-либо вопросы, то Вы можете посмотреть видеоурок, в котором мы подробно разбираем создание данной программы, выводящей данные из БД в DataGridView с помощью языка C#:
Сегодня я решил написать Вам о том, как работать с элементом управления DataGridView в языке программирования C#.
DataGridView — очень мощный инструмент для работы с данными. Он очень гибок и позволяет автоматизировать вывод информации. Я постараюсь рассказать Вам о базовой работе с данным элементом, а так же привести пример автоматизации обновления данных в таблице.
Для тех, кто не знает о элементе управления DataGridView — скажу что данный контрол позволяет вывести таблицу с данными в Вашей программе. Данный элемент управления имеет огромное число настроек. Благодаря этому Вы скорей всего сможете подстроить внешний вид таблицы так, как Вам нужно. Все настройки доступны в панели свойств элемента в Visual Studio. Я буду задавать свойства нашего элемента пряма в коде, для большей наглядности.
И так создадим новый проект WinForms и добавим на форму элемент DataGridView. При добавлении элемента DataGridView появляется окно, где можно указать источник данных для нашей таблицы. Просто закроем данное окно. Перейдем в событие загрузки формы и зададим шапку для нашей таблицы.
private void Form1_Load(object sender, EventArgs e) { //создадим таблицу вывода товаров с колонками //Название, Цена, Остаток var column1 = new DataGridViewColumn(); column1.HeaderText = "Название"; //текст в шапке column1.Width = 100; //ширина колонки column1.ReadOnly = true; //значение в этой колонке нельзя править column1.Name = "name"; //текстовое имя колонки, его можно использовать вместо обращений по индексу column1.Frozen = true; //флаг, что данная колонка всегда отображается на своем месте column1.CellTemplate = new DataGridViewTextBoxCell(); //тип нашей колонки var column2 = new DataGridViewColumn(); column2.HeaderText = "Цена"; column2.Name = "price"; column2.CellTemplate = new DataGridViewTextBoxCell(); var column3 = new DataGridViewColumn(); column3.HeaderText = "Остаток"; column3.Name = "count"; column3.CellTemplate = new DataGridViewTextBoxCell(); dataGridView1.Columns.Add(column1); dataGridView1.Columns.Add(column2); dataGridView1.Columns.Add(column3); dataGridView1.AllowUserToAddRows = false; //запрешаем пользователю самому добавлять строки for (int i = 0; i < 5; ++i) { //Добавляем строку, указывая значения колонок поочереди слева направо dataGridView1.Rows.Add("Пример 1, Товар " + i, i * 1000, i); } for (int i = 0; i < 5; ++i) { //Добавляем строку, указывая значения каждой ячейки по имени (можно использовать индекс 0, 1, 2 вместо имен) dataGridView1.Rows.Add(); dataGridView1["name", dataGridView1.Rows.Count - 1].Value = "Пример 2, Товар " + i; dataGridView1["price", dataGridView1.Rows.Count - 1].Value = i * 1000; dataGridView1["count", dataGridView1.Rows.Count - 1].Value = i; } //А теперь простой пройдемся циклом по всем ячейкам for (int i = 0; i < dataGridView1.Rows.Count; ++i) { for (int j = 0; j < dataGridView1.Columns.Count; ++j) { //Значения ячеек хряняться в типе object //это позволяет хранить любые данные в таблице object o = dataGridView1[j, i].Value; } } } }
В целом это и есть базовая работа с элементом DataGridView. По сути мы имеем работу с матрицей (двумерным массивом). Давайте теперь рассмотрим базовый вариант автоматизации обновления данных в таблице — механизм привязки (Binding).
Для этого создадим класс, который будет играть роль одной строки. Т.е. по сути нам нужно создать класс, описывающий колонки нашей таблицы.
class SampleRow { public string Name { get; set; } //обязательно нужно использовать get конструкцию public float Price { get; set; } public int Count { get; set; } public string Hidden = ""; //Данное свойство не будет отображаться как колонка public SampleRow(string name, float price, int count) { this.Name = name; this.Price = price; this.Count = count; } }
Теперь мы можем написать следующий код в событии формы OnLoad:
private void Form1_Load(object sender, EventArgs e) { BindingList<SampleRow> data = new BindingList<SampleRow>(); //Специальный список List с вызовом события обновления внутреннего состояния, необходимого для автообновления datagridview data.Add(new SampleRow("Товар 1", 100, 1)); data.Add(new SampleRow("Товар 2", 200, 2)); data.Add(new SampleRow("Товар 3", 300, 3)); dataGridView1.DataSource = data; data.Add(new SampleRow("Товар 4", 400, 4)); }
Данная тема использует программный код из темы:
- Разработка приложения демонстрации работы элемента управления DataGridView без использования подключения к базе данных
Содержание
- Вопрос/ответ
- 1. Какое назначение элемента управления DataGridView?
- 2. Можно ли использовать DataGridView непосредственно без связывания его с базой данных?
- 3. Как программно задать размеры DataGridView? Свойства Width, Height
- 4. Какие виды данных могут быть представлены в ячейках DataGridView?
- 5. Добавление столбца программным путем
- 6. Как программно реализовать удаление столбца? Методы Remove() и RemoveAt()
- 7. Программное добавление строки. Метод Add()
- 8. Программное удаление строки. Методы Remove() и RemoveAt()
- 9. Задание текста заголовка в заданном столбце программным путем
- 10. Установка выравнивания заголовка в заданном столбце программным путем
- 11. Установка шрифта заголовка в столбцах программным путем
- 12. Установка цвета шрифта заголовков программным путем
- 13. Установка размеров dataGridView1 программным путем
- 14. Установка ширины заданного столбца dataGridView1
- 15. Установка высоты заданной строки dataGridView1
- 16. Установка выравнивания в заданном столбце и строке
- 17. Установка шрифта, цвета символов и фона в первом столбце
- 18. Определение количества столбцов
- 19. Определение количества строк
- 20. Определение ширины заданного столбца в пикселах
- 21. Определение высоты заданной строки в пикселах
- 22. Определение номера выделенной строки. Свойство CurrentRow
- Связанные темы
Поиск на других ресурсах:
1. Какое назначение элемента управления DataGridView?
В Microsoft Visual Studio элемент управления dataGridView разработан для использования в приложениях, созданных по шаблону Windows Forms Application. Данный элемент управления позволяет организовывать данные в виде таблицы. Данные могут быть получены из базы данных, коллекции, внутренних переменных — массивов или других объектов программы.
Данный элемент управления аналогичен компоненту TStringGrid в системе визуальной разработки приложений.
Данный элемент размещен на панели инструментов ToolBox во вкладках «All Windows Forms» или «Data» (рисунок 1).
После размещения на форме, система создает объект (переменную) с именем dataGridView1. С помощью этого имени можно программно оперировать методами и свойствами этого элемента управления.
Рис. 1. Элемент управления dataGridView1 и окно Properties со свойствами
⇑
2. Можно ли использовать DataGridView непосредственно без связывания его с базой данных?
Да, можно. В DataGridView данные могут быть получены из базы данных, коллекции, внутренних структур данных (массивов, структур и т.д.).
⇑
3. Как программно задать размеры DataGridView? Свойства Width, Height
Для задания размеров DataGridView используются свойства Width и Height.
// задать размеры dataGridView1. // Высота - 200 пикселей. Ширина - 350 пикселей dataGridView1.Width = 350; dataGridView1.Height = 200;
⇑
4. Какие виды данных могут быть представлены в ячейках DataGridView?
Виды данных, которые могут быть представлены в ячейках dataGridView:
- dataGridViewButtonColumn. Ячейки представлены в виде кнопок типа Button;
- dataGridViewCheckBoxColumn. Ячейки представлены элементами управления типа CheckBox, которые позволяют выбирать несколько вариантов (опций) из набора предложенных;
- dataGridViewComboBoxColumn. Ячейки представлены элементами управления типа ComboBox, предназначенных для выбора одного из нескольких вариантов;
- dataGridViewImageColumn. Ячейки таблицы есть изображениями типа Image;
- dataGridViewLinkColumn. Ячейки таблицы представлены ссылками;
- dataGridViewTextBoxColumn. Этот вариант предлагается по умолчанию при добавлении (создании) нового столбца. В этом случае ячейки таблицы представлены в виде полей ввода. Это позволяет вводить данные в таблицу как в матрицу.
⇑
5. Добавление столбца программным путем
Добавить столбец в dataGridView можно:
- с помощью специального мастера;
- программным путем.
Столбцы в dataGridView организованы в виде коллекции Columns типа DataGridViewColumnCollection. Чтобы добавить столбец программным путем используется метод (команда) Add из коллекции Columns.
Метод Add имеет 2 варианта реализации:
int DataGridViewColumnCollection.Add(DataGridViewColumn dataGridViewColumn); int DataGridViewColumnCollection.Add(string ColumnName, string HeaderText);
где
- DataGridViewColumn – тип System.Windows.Forms.Column который добавляется;
- ColumnName – название, по которому будет осуществляться обращение к столбцу из других методов;
- HeaderText – текст, который будет отображаться в заголовке столбца.
Фрагмент кода, который добавляет два произвольных столбца следующий:
// Добавить столбец с именем column-1, заголовок столбца - "Header column - 1" dataGridView1.Columns.Add("column-1", "Header column - 1"); // Добавить столбец с именем column-2 dataGridView1.Columns.Add("column-2", "Header column - 2");
В реальных программах название столбца и его заголовка получаются из других элементов управления, например TextBox.
Для вставки столбца используется метод Insert, который имеет следующее объявление
void DataGridViewColumnCollection.Insert(int columnIndex, DataGridViewColumn dataGridViewColumn);
Вызов этого метода из программного кода аналогичен методу Add.
⇑
6. Как программно реализовать удаление столбца? Методы Remove() и RemoveAt()
Чтобы удалить столбец используется один из двух методов из коллекции Columns:
- метод RemoveAt() – удаляет столбец по заданному индексу в коллекции;
- метод Remove() – удаляет столбец по его имени.
Общий вид метода RemoveAt():
void DataGridViewColumnCollection.RemoveAt(int index);
где
- index – заданный индекс в коллекции. Индексы нумеруются с 0.
void DataGridViewColumnCollection.Remove(string ColumnName);
где
- ColumnName – название столбца (но не название заголовка столбца), которое задается в методе Add() первым параметром. Столбцы в коллекции могут иметь одинаковые значения ColumnName. Если при вызове метода Remove(), столбца с именем ColumnName нет, то генерируется исключительная ситуация.
Фрагмент кода удаления столбца с помощью метода RemoveAt():
// удаление столбца в позиции index int index; // номер столбца, который удаляется int n; // текущее количество столбцов в dataGridView // задать номер столбца, который удаляется index = 1; // определить текущее количество столбцов в dataGridView n = dataGridView1.Columns.Count; // удаление if ((n > 0) && (index >= 0) && (index < n)) { dataGridView1.Columns.RemoveAt(index); label1.Text = "Столбец удален"; } else { label1.Text = "Столбец не удален"; }
⇑
7. Программное добавление строки. Метод Add()
Добавлять строку можно одним из двух способов:
- путем непосредственного ввода с клавиатуры;
- программным путем.
Строки в DataGridView организованы в виде коллекции Rows типа dataGridViewRowCollection.
Ниже приведен фрагмент метода, добавляющего 2 произвольные строки в таблицу
// Добавить строки в таблицу if (dataGridView1.Columns.Count <= 0) { label1.Text = "Строки не добавлены"; return; } dataGridView1.Rows.Add("Ivanov I.I.", 25, "New York"); dataGridView1.Rows.Add("Petrenko P.P.", 38, "Moscow"); label1.Text = "Строки добавлены";
⇑
8. Программное удаление строки. Методы Remove() и RemoveAt()
Для удаления строки используется один из двух методов:
- метод RemoveAt() – удаляет строку по заданному индексу;
- метод Remove() – удаляет строку, которая есть входным параметром типа DataGridViewRow.
Фрагмент кода удаления строки имеет вид:
// Удалить строку int nr, nc; nc = dataGridView1.Columns.Count; // количество столбцов nr = dataGridView1.RowCount; if ((nc > 0) && (nr > 1)) { dataGridView1.Rows.RemoveAt(0); // удалить первую строку label1.Text = "Строка удалена"; } else { label1.Text = "Строка не удалена"; }
⇑
9. Задание текста заголовка в заданном столбце программным путем
Чтобы задать текст заголовка в заданном столбце используется свойство HeaderText. Фрагмент кода установки текста заголовка в столбце с индексом 0 имеет вид:
// задать текст в заголовке int nc = dataGridView1.ColumnCount; if (nc > 0) { // задать новый текст заголовке первого столбца dataGridView1.Columns[0].HeaderText = "Header - 1"; label1.Text = "Текст задан"; } else { label1.Text = "Текст не задан"; }
⇑
10. Установка выравнивания заголовка в заданном столбце программным путем
Выравнивание заголовка в столбце задается с помощью свойства HeaderCell.Style.Alignment.
Фрагмент кода установки выравнивания в заголовке столбца с индексом 0:
// выравнивание заголовка int nc; nc = dataGridView1.ColumnCount; if (nc > 0) { // задать выравнивание по центру (по горизонтали и по вертикалу) dataGridView1.Columns[0].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter; label1.Text = "Выравнивание выполнено"; } else { label1.Text = "Выравнивание не выполнено"; }
⇑
11. Установка шрифта заголовка в столбцах программным путем
Для установки шрифта в заголовках столбцов используется свойство ColumnHeadersDefaultCellStyle. В этом свойстве используется свойство Font.
Во фрагменте кода создается шрифт Arial, имеющий размер 12 и курсивное начертание.
// задать шрифт в заголовке // создать шрифт "Arial", размер 12, начертание - "курсив" Font F = new Font("Arial", 12, FontStyle.Italic); if (nc > 0) { // установить шрифт заголовка dataGridView1.ColumnHeadersDefaultCellStyle.Font = F; label1.Text = "Шрифт задан"; } else { label1.Text = "Шрифт не задан"; }
⇑
12. Установка цвета шрифта заголовков программным путем
Чтобы задать цвет шрифта заголовков программным путем нужно использовать свойство ColumnHeaderDefaultCellStyle. В этом свойстве есть свойства ForeColor и BackColor.
int nc; nc = dataGridView1.ColumnCount; if (nc > 0) { // создать системный шрифт Font F = new Font("Arial", 14); // задать цвет в заголовках столбцов dataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.Purple; // задать шрифт dataGridView1.Columns[0].DefaultCellStyle.Font = F; label1.Text = "Цвет заголовка изменен"; } else { label1.Text = "Цвет не изменен"; }
⇑
13. Установка размеров dataGridView1 программным путем
// задать размер dataGridView1
dataGridView1.Width = 600;
dataGridView1.Height = 150;
⇑
14. Установка ширины заданного столбца dataGridView1
// задать ширину столбца int nc; nc = dataGridView1.ColumnCount; if (nc > 0) { // задать ширину столбца с индексом 0 dataGridView1.Columns[0].Width = 70; label1.Text = "Ширина столбца задана"; } else { label1.Text = "Ширина столбца не задана"; }
⇑
15. Установка высоты заданной строки dataGridView1
// задать высоту строки int nc, nr; nc = dataGridView1.ColumnCount; nr = dataGridView1.RowCount; if ((nc > 0) && (nr > 1)) { dataGridView1.Rows[0].Height = 50; label1.Text = "Высота строки задана"; } else { label1.Text = "Высота строки не задана"; }
⇑
16. Установка выравнивания в заданном столбце и строке
// выравнивание в строках int nc, nr; nc = dataGridView1.ColumnCount; nr = dataGridView1.RowCount; if ((nc > 0)&&(nr>1)) { // выравнивание для всех строк dataGridView1.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomRight; // выравнивание для строки с индексом 0 dataGridView1.Rows[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; // выравнивание для столбца с индексом 0 dataGridView1.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomLeft; }
⇑
17. Установка шрифта, цвета символов и фона в первом столбце
Чтобы задать шрифт, цвет символов и фона в первом столбце, используется свойство DefaultCellStyle столбца с индексом 0. В этом свойстве есть свойства Font, BackColor, ForeColor.
Ниже приведен фрагмент кода, который задает цвет шрифта, символов и фона в dataGridView1.
// шрифт и цвет в первом столбце int nc, nr; nc = dataGridView1.ColumnCount; nr = dataGridView1.RowCount; if ((nc > 0) && (nr > 1)) { // создать шрифт Font F = new Font("Times New Roman", 10, FontStyle.Bold); // цвет символов и фона в первом столбце dataGridView1.Columns[0].DefaultCellStyle.BackColor = Color.Red; dataGridView1.Columns[0].DefaultCellStyle.ForeColor = Color.Blue; // шрифт в первом столбце dataGridView1.Columns[0].DefaultCellStyle.Font = F; label1.Text = "Шрифт и цвет в 1-м столбце изменен"; } else { label1.Text = "Шрифт не изменен"; }
⇑
18. Определение количества столбцов
// определить количество столбцов int n; n = dataGridView1.Columns.Count; label1.Text = n.ToString();
⇑
19. Определение количества строк
// определить количество строк без строки заголовка int n; n = dataGridView1.Rows.Count; label1.Text = (n - 1).ToString();
⇑
20. Определение ширины заданного столбца в пикселах
// ширина столбца в пикселах int w; int nc; nc = dataGridView1.Columns.Count; if (nc > 0) { w = dataGridView1.Columns[0].Width; label1.Text = w.ToString(); }
⇑
21. Определение высоты заданной строки в пикселах
// определить высоту строки в пикселах int h; int nr, nc; nc = dataGridView1.Columns.Count; nr = dataGridView1.RowCount; if ((nr>1)&&(nc>0)) { h = dataGridView1.Rows[0].Height; label1.Text = h.ToString(); }
⇑
22. Определение номера выделенной строки. Свойство CurrentRow
Часто в приложениях нужно получить выделенную строку в таблице DataGridView. Для этого используется свойство CurrentRow, которое содержит всю необходимую информацию о выделенной строке. Чтобы определить позицию выделенной строки используется свойство CurrentRow.Index.
Пример. В фрагменте кода определяются значения полей выделенной строки. Предварительно осуществляется проверка в которой проверяется вообще ли строка выделена.
// 1. Проверка, есть ли строки в dataGridView1 if (dataGridView1.RowCount <= 1) return; // 2. Определение номера (позиции) выделенной строки int index = dataGridView1.CurrentRow.Index; // 3. Проверка, выделена ли вообще строка if (index == dataGridView1.RowCount - 1) { label1.Text = "Строка не выделена"; return; } // 3. Если строка выделена, то вывести информацию о ней string name = (string)dataGridView1.Rows[index].Cells[0].Value; string surname = (string)dataGridView1.Rows[index].Cells[1].Value; string telephone = (string)dataGridView1.Rows[index].Cells[2].Value; label1.Text = "Выделенная строка: " + name + "/" + surname + "/" + telephone;
⇑
Связанные темы
- Вывод таблицы базы данных Microsoft Access в компоненте dataGridView
- C#. Курсовая работа. Разработка приложения автоматизации диспетчера касс автовокзала
- Курсовая работа. Разработка программы мониторинга загрязнения окружающей среды
⇑
DataGridView — стандартный GUI компонент для отображения и редактирования таблиц. Здесь коротко рассмотрены основные моменты работы с этим классом.
Перекиньте стандартным способом в форму компонент DataGridView.
Источник данных при создании можно не указывать, так как DataGridView позволяет хранить данные внутри себя и добавлять/удалять их на лету, во время выполнения (runtime). После этого редактором свойств настройте поведение по умолчанию нового экземпляра DataGridView. Я обычно меняю свойства AllowUserToAddRows на false, AllowUserToDeleteRows на false, ReadOnly на true. Можно также переименовать экземпляр из dataGridView1 в что-нибудь более осмысленное, подходящее для Вашей программы.
Добавление строк и столбцов. Столбцы и строки можно добавлять во время выполнения программы (подробнее см. [1]). Пример добавления строк:
dataGridView1->Rows->Add();
Однако если назначение и структура таблицы (количество и наименование столбцов) известны заранее, то можно редактором свойств добавить столбцы. Для этого редактируют свойство Columns.
Стиль текста заголовка. Пример, как можно установить жирный шрифт в заголовке таблицы:
DataGridView dgv = 0 == tabControl1.SelectedIndex ? ОсновнойDGV : РезервDGV; DataGridViewCellStyle style = dgv.ColumnHeadersDefaultCellStyle; style.Font = new Font(style.Font, FontStyle.Bold); // Жирный текст
Как поменять цвет фона заголовка и цвет шрифта:
dgv.EnableHeadersVisualStyles = false;
dgv.ColumnHeadersDefaultCellStyle.BackColor = Color.Navy;
dgv.ColumnHeadersDefaultCellStyle.ForeColor = Color.White;
Работа с ячейками. Обращение к ячейкам DataGridView довольно простое. Индексация столбцов (Columns) и строк (Rows) идет относительно нуля. Столбец с индексом 0 самый левый, и строка с индексом 0 самая верхняя. Количество строк можно получить через свойство RowCount. Добавляются строки методом Удаляются строки методом Rows->Add(), удаляются методом Rows->RemoveAt(номер строки). Пример добавления и удаления строк:
// Добавим в dataGridView1 4 строки: dataGridView1->Rows->Add(); dataGridView1->Rows->Add(); dataGridView1->Rows->Add(); dataGridView1->Rows->Add();
// Удалим все строки из dataGridView1:
while (0 != dataGridView1->RowCount) dataGridView1->Rows->RemoveAt(0);
Более простой способ удаления строк:
dataGridView1->Rows->Clear();
Текущая строка. Узнать номер текущей строки можно через HitTestInfo->RowIndex:
int idx = dataGridView1->HitTestInfo->RowIndex;
Установить (поменять) текущую строку можно через свойство CurrentCell (в примере устанавливаем третью текущую строку):
int idx = 2; dataGridView1->CurrentCell = dataGridView1->Rows[idx]->Cells[0];
Текущая строка помечена в таблице треугольничком:
// Необязательный шаг: отмена выделения текущей ячейки,
// чтобы она не подкрашивалась: dataGridView1->CurrentCell->Selected = false;
Вид таблицы после отмены выделения текущей ячейки:
Изменение данных в ячейках. Менять данные в ячейках таблицы можно только тогда, когда существуют соответствующий столбец и соответствующая строка, иначе произойдет ошибка выполнения («System.ArgumentOutOfRangeException» произошло в mscorlib.dll Дополнительные сведения: Индекс за пределами диапазона. Индекс должен быть положительным числом, a его размер не должен превышать размер коллекции.). После добавления строки методом Add все значения в ячейках добавленной строки будут пустые. К ячейке таблицы можно обращаться по номеру столбца и номеру строки через свойство Value.
Пример добавления строк и заполнения таблицы:
int i = 0; //нумерация строк начинается с 0
if ( (dataGridView1->RowCount - 1) < i ) dataGridView1->Rows->Add();
// № строки добавляем в первый столбец Cells[0]: dataGridView1->Rows[i]->Cells[0]->Value = (i+1).ToString();
// Текст добавим во второй столбец Cells[1]: dataGridView1->Rows[i]->Cells[1]->Value = "Текст в ячейке";
i++; //переходим к следующей строке dataGridView1->Rows[i]->Cells[0]->Value = (i+1).ToString(); ...
Стиль, цвет текста. Внешний вид текста в ячейке можно менять через свойство Style. Пример изменения цвета нужной ячейки на C#:
private void msgtable(string msg, Color textcolor) { dataGridView1.Rows[rowidx].Cells[2].Style.ForeColor = textcolor; dataGridView1.Rows[rowidx].Cells[2].Value = msg; }
...
case TCalibReport.ITERATE_OK: msgtable("OK", Color.Green); break; ...
Пример изменения шрифта ячейки на жирный:
Font font = new Font(DataGridView.DefaultFont, FontStyle.Bold);
dgv.Rows[ТекущаяСтрока].Cells[ТекущийСтолбец].Style.Font = font;
Как обращаться к столбцам не по их индексу, а по имени? Нумерация строк и столбцов начинается с нуля, и когда нам нужно обратиться к конкретной ячейке строки, то это можно сделать через числовой индекс: Rows[индексстроки].Cells[индексстолбца]. Однако есть удобная возможность получить индекс столбца по имени типа столбца:
dgv.Rows[ТекущаяСтрока].Cells[УровеньУст.Index].Value = Установлено.ToString("F2", ci); dgv.Rows[ТекущаяСтрока].Cells[УровеньСчит.Index].Value = Считано.ToString("F2", ci);
В этом примере УровеньУст и УровеньСчит — типы столбцов, которые были установлены во время компиляции визуальным редактированием свойства Columns таблицы dgv. Используется свойство Index этих типов.
Клик на заголовке строки. Обработка клика на заголовке строки на C#:
private void dataGridView1_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) { rowstart = e.RowIndex; rowend = e.RowIndex; DisableGUI(); bwCalibr.RunWorkerAsync(); }
Как удалить последнюю пустую строку?
Ответ: после манипуляции со строками и добавления новых строк установите в false свойство AllowUserToAddRows:
dataGridView1.AllowUserToAddRows = false;
[Ссылки]
1. Все о DataGridView. Учебник site:datagridview.narod.ru.
2. C#: экспорт/импорт DataGridView в XML и HTML.
Время на прочтение
6 мин
Количество просмотров 22K
Доброго времени суток!
В данной статье я опишу создания своих элементов для C# Windows Form.
Для примера буду создавать таблицу со всем функционалом DataGridView. Позже перейдем на свои элементы. Создание первого элемента разобьем на несколько уроков. В данном уроке произведем от рисовку таблицы, а также: создание столбцов, строк, ячеек.
Для написания будем использовать .Net FrameWork 4.7.x, среда разработки Visual Studio 2019.
В первую очередь создадим обычный проект Windows Form. Думаю не нужно это показывать. А уже потом создаем проект «Библиотека элементов управления Windows Form»(Назовем его CustomControl).
Далее у нас будет создан файл UserControl.cs. Удаляем его и создаем обычный класс TableCustoms.cs.Наш класс будет наследоваться от класса Control.
Далее в этом же файле создадим еще несколько классов, а именно:Column,Row,Cell. Рассмотрим каждый по отдельности. Начнем с Column:
[Serializable]
public class Column
{
public string Name { get; set; } = "NameColumn";//Наименование Столбца
public string Caption { get; set; } = "CaptionColumn";//Текст заголовка
public int Width { get; set; } = 100;//Стандартная ширина
public Color Back { get; set; } = Color.White;//Цвет фона
public Column()
{
}
}
Класс Row:
[Serializable]
public class Row
{
public int Heigth { get; set; } = 20;// Высота строки
public List<Cell> Cells { get; set; } = new List<Cell>();//список ячеек
public Row()
{
}
public Row(List<Cell> cells)
{
Cells = cells;
}
}
Класс Cell(Для поддержки копирования добавляем интерфейс ICloneable):
[Serializable]
public class Cell : ICloneable
{
public object Value { get; set; } = null;//значение ячейки
public Cell()
{
}
public object Clone()
{
return MemberwiseClone();
}
}
Теперь настроим наш основной класс TableCustoms:
public class TableCustoms : Control
{
#region Перемененные
public ObservableCollection<Column> Columns { get; set; } = new ObservableCollection<Column>();//Список столбцов таблицы
private ObservableCollection<Row> rows = new ObservableCollection<Row>();//Список строк
private int countRow = 0;//количество строк
#endregion
#region Свойства
public int CountRow // гетер и сетер при увеличении переменной на N раз
{
get { return countRow; }
set
{
//При увеличении добавляем
if (value > countRow)
{
int iteration = value - countRow;
for (int i = 0; i < iteration; i++)
{
rows.Add(new Row());
}
}
//при уменьшении удаляем с конца
if (value < countRow)
{
int iteration = countRow - value;
for (int i = 0; i < iteration; i++)
{
rows.Remove(rows[rows.Count - 1]);
}
}
countRow = value;
}
}
//гетер и сетер для списка строк, будет использоваться позже
public ObservableCollection<Row> Rows
{
get { return rows; }
set { }
}
public int ColumnHeaderHeigth { get; set; } = 20;//высота шапки таблицы
public int RowHeaderWidth { get; set; } = 20;//высота заголовков строк
public Color ColumnHeaderBack { get; set; } = SystemColors.Control;//Основной цвет фона заголовков таблицы
public Color BorderColor { get; set; } = Color.Black;//Стандартный цвет границ таблицы
public bool NumerableRows { get; set; } = false;//Флаг автоматической нумерации
#endregion
//Метода изменения столбцов, будет использоваться в следующем уроке
private void EditColumn()
{
}
//Метод изменения строк
private void EditRows()
{
if (countRow < rows.Count)//Увеличение количества строк
{
rows[rows.Count - 1].Cells = CreatCells(Columns.Count);//Добавление пустых ячеек в строку
countRow++;
}
if (CountRow > rows.Count)//уменьшение количества строк
{
countRow--;
}
}
//метод создания N количества ячеек
private List<Cell> CreatCells(int Count)
{
// return Enumerable.Repeat(new Cell(), Count).ToList();
List<Cell> result = new List<Cell>();
for (int i = 0; i < Count; i++)
{
result.Add(new Cell());
}
return result;
}
public TableCustoms()
{
rows.CollectionChanged += (e, v) => EditRows();//проверка изменения списка
Columns.CollectionChanged += (e, v) => EditColumn();//проверка изменения списка
BackColor = SystemColors.AppWorkspace;//Стандартный фон
PanelTable panelTable = new PanelTable(this);//Создание основной панели
panelTable.Dock = DockStyle.Fill;//Растягиваем основную панель по Control
Controls.Add(panelTable);//Добавление панели на Control
}
}
Для того, чтобы у нас были полосы прокрутки нужно использовать ScrollableControl, поэтому создадим класс PanelTable наследуем ScrollableControl и помещаем его на Control(в следующем уроке объясню почему создаем два разных контрола, а не используем сразу ScrollableControl):
internal class PanelTable : ScrollableControl//Control со ScrolLbar
{
private TableCustoms BParent;//переменная основного класса, для работы с свойствами
public PanelTable(TableCustoms bParent)
{
HScroll = true;//Отображение ползунка по горизонтали
VScroll = true;//Отображение ползунка по вертикали
AutoScroll = true;//Автоматическое появление полос прокрутки
BParent = bParent;
}
//переопределение метода
protected override void OnPaint(PaintEventArgs e)
{
Matrix m = new Matrix();
m.Translate(this.AutoScrollPosition.X, this.AutoScrollPosition.Y, MatrixOrder.Append);
e.Graphics.Transform = m;
Graphics graf = e.Graphics;
int maxWidth = 0;//Высота AutoScrollMinSize
int maxHeight = 0;//Ширина AutoScrollMinSize
//расчитываем ширину
foreach (Column item in BParent.Columns)
{
maxWidth += item.Width;
}
//расчитываем высоту
foreach (Row item in BParent.Rows)
{
maxHeight += item.Heigth;
}
AutoScrollMinSize = new Size(maxWidth + 100, maxHeight + 100);//назначаем AutoScrollMinSize относительно этого будут появляться полосы прокрутки
graf.Clear(BParent.BackColor);
DrawHeaderColumns(graf);//Отрисовка заголовков столбцов таблицы
DrawHeaderRows(graf);//Отрисовка заголовков строк таблицы
DrawCells(graf);//Отрисовка ячеек
base.OnPaint(e);
}
/// <summary>
/// Отрисока заголовков столбцов
/// </summary>
/// <param name="graf"></param>
private void DrawHeaderColumns(Graphics graf)
{
int x = 2;
Rectangle rect;
rect = new Rectangle(x, 1, BParent.RowHeaderWidth, BParent.ColumnHeaderHeigth);
graf.DrawRectangle(new Pen(BParent.BorderColor), rect);
graf.FillRectangle(new SolidBrush(BParent.ColumnHeaderBack), rect);
x += BParent.RowHeaderWidth + 1;
foreach (Column item in BParent.Columns)
{
rect = new Rectangle(x, 1, item.Width, BParent.ColumnHeaderHeigth);
graf.DrawRectangle(new Pen(BParent.BorderColor), rect);
graf.FillRectangle(new SolidBrush(BParent.ColumnHeaderBack), rect);
if (item.Caption.Length != 0)
{
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
graf.DrawString(item.Caption, new Font("Times", 9), Brushes.Black, rect, sf);
}
x += item.Width + 1;
}
}
//Отрисовка заголовков строк
private void DrawHeaderRows(Graphics graf)
{
int y = 1;
int i = 0;
Rectangle rect;
y += BParent.RowHeaderWidth + 1;
foreach (Row item in BParent.Rows)
{
rect = new Rectangle(2, y, BParent.RowHeaderWidth, item.Heigth);
graf.DrawRectangle(new Pen(BParent.BorderColor), rect);
graf.FillRectangle(new SolidBrush(BParent.ColumnHeaderBack), rect);
if (BParent.NumerableRows)
{
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
graf.DrawString(i.ToString(), new Font("Times", 9), Brushes.Black, rect, sf);
}
i++;
y += item.Heigth + 1;
}
}
//отрисовка ячеек
private void DrawCells(Graphics graf)
{
int x = 2 + BParent.RowHeaderWidth + 1;
int y = 2 + BParent.ColumnHeaderHeigth;
Rectangle rect;
int i = 0;
foreach (Row itemRow in BParent.Rows)
{
foreach (Column itemColumn in BParent.Columns)
{
rect = new Rectangle(x, y, itemColumn.Width, itemRow.Heigth);
graf.DrawRectangle(new Pen(BParent.BorderColor), rect);
graf.FillRectangle(new SolidBrush(Color.White), rect);
if (itemRow.Cells[i].Value != null)
{
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
graf.DrawString(itemRow.Cells[i].Value.ToString(), new Font("Times", 9), Brushes.Black, rect, sf);
}
x += itemColumn.Width + 1;
i++;
}
i = 0;
y += itemRow.Heigth + 1;
x = 2 + BParent.RowHeaderWidth + 1;
}
}
}
После этого «Пересобираем проект» элемента и добавляем элемент на форму(в основном проекте):
Теперь проверим некоторые методы нашего элемента:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
tableCustoms1.Rows.Add(new Row());//добавление строки
tableCustoms1.Rows.Add(new Row());
tableCustoms1.Rows[0].Cells[0].Value = "1";//Изменение значения ячейки
tableCustoms1.Rows[1].Cells[1].Value = "2";
tableCustoms1.CountRow++;//увеличение числа строк
tableCustoms1.Rows[0].Cells[0].Value = "привет";
}
}
Запускаем наш проект: