Windows forms datagridview таблица c

В Windows Forms табличные данные удобно выводить с помощью элемента управления DataGridView. В статье покажем, как это сделать на примере таблицы из базы данных и языка программирования C#.

Исходные данные для DataGridView

Имеется таблица в базе данных Microsoft SQL Server с информацией о факультетах университета.

Данные для DataGridView

Эти данные будем выводить в элемент DataGridView, расположенный на Windows Forms.

Программа с DataGridView

Создадим новый проект Windows Forms на Visual C# в Visual Studio. На форме расположим элемент управления DataGridView — для этого перетащите его с «Панели элементов» на макет окна.

Добавим в DataGridView три столбца под три соответствующих колонки из таблицы БД с помощью кнопки «Правка столбцов».

Добавление столбцов в 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 в языке программирования 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. С помощью этого имени можно программно оперировать методами и свойствами этого элемента управления.

C# элемент управления dataGridView свойства

Рис. 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-adding.png

Источник данных при создании можно не указывать, так как DataGridView позволяет хранить данные внутри себя и добавлять/удалять их на лету, во время выполнения (runtime). После этого редактором свойств настройте поведение по умолчанию нового экземпляра DataGridView. Я обычно меняю свойства AllowUserToAddRows на false, AllowUserToDeleteRows на false, ReadOnly на true. Можно также переименовать экземпляр из dataGridView1 в что-нибудь более осмысленное, подходящее для Вашей программы.

Добавление строк и столбцов. Столбцы и строки можно добавлять во время выполнения программы (подробнее см. [1]). Пример добавления строк:

dataGridView1->Rows->Add();

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

DataGridView-edit-columns.png

Стиль текста заголовка. Пример, как можно установить жирный шрифт в заголовке таблицы:

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];

Текущая строка помечена в таблице треугольничком:

DataGridView-current-row.png

// Необязательный шаг: отмена выделения текущей ячейки,
// чтобы она не подкрашивалась:
dataGridView1->CurrentCell->Selected = false;

Вид таблицы после отмены выделения текущей ячейки:

DataGridView current cell remove selection

Изменение данных в ячейках. Менять данные в ячейках таблицы можно только тогда, когда существуют соответствующий столбец и соответствующая строка, иначе произойдет ошибка выполнения («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;
...

dataGridView Cells Style ForeColor

Пример изменения шрифта ячейки на жирный:

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 этих типов.

DataGridView Column Name

Клик на заголовке строки. Обработка клика на заголовке строки на C#:

private void dataGridView1_RowHeaderMouseDoubleClick(object sender,
                                                     DataGridViewCellMouseEventArgs e)
{
   rowstart = e.RowIndex;
   rowend = e.RowIndex;
   DisableGUI();
   bwCalibr.RunWorkerAsync();
}

Как удалить последнюю пустую строку?

DataGridView last empty row

Ответ: после манипуляции со строками и добавления новых строк установите в 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;
                }
            }
        }

После этого «Пересобираем проект» элемента и добавляем элемент на форму(в основном проекте):

image

Теперь проверим некоторые методы нашего элемента:

  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 = "привет";
        }
    }

Запускаем наш проект:

image

  • Windows font viewer что это
  • Windows forms combobox значение по умолчанию
  • Windows for checking for memory problems
  • Windows forms combobox запретить ввод
  • Windows forms c текстовый редактор