Работаем с DataGridView

Июнь 9th, 2011 § 13 comments

DataGridView очень мощный контрол, идеально подходит для отображения баз данных, а так же массы другой пользовательской информации. В одной из статей прочитал что он заслуживает отдельной книги, что же спорить с этим не буду. Здесь я постараюсь про демонстрировать основные возможности этого контрола, а именно вставка информации и её чтение. На полнотк изложения это не претендует, если Вам интересно, то на RSDN можно найти очень хорошую статью по DataGridView тут .

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

Уже пошло слишком много лирике, это же не полноценная статья, а не более чем заметка. Ближе к коду так сказать.

Два пути как создать столбец в DataGridView, первый и самый простой


//Grid это экземляпр DataGridView, созданный либо в дизайнере либо в ручную где-то в вашем коде

Grid.Columns.Add("firstcolumn","firstcolumn");

Первый параметр у Add это название столбца и текст который будет отображаться в заголовке столбца.

Второй способ

DataGridViewColumn column = new DataGridViewColumn();
DataGridViewCell cell = new DataGridViewTextBoxCell();
column.HeaderText = "secondcolumn";
column.Name = "secondcolumn";
column.CellTemplate = cell;
Grid.Columns.Add(column);

Тут мы сначала создаем экземпляр DataGridViewColumn, это собственно и будет наш столбец, потом нам нужно создать экземпляр DataGridViewCell и указать какой тип ячейки. Дальше указывает название счтолбцы, надпись в заголовке и шаблон ячеек. Обязательным здесь является только указания шаблона ячеек, т.к. без него при попытки добавть колноку вы получите Exception.

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

После того как мы создали нужное количество столбцов их нужно заполнить строками, как это можно сделать тут условно говоря тоже два пути (или даже четыре). Расскажу о мало полезных двух (опять же как сказать). Если нам нужно добавить пустую строку мы можем вызвать метода Grid.Rows.Add() если нужно добавить диапазон строк то можно сделать так  Grid.Rows.Add(10), за место 10-ти подставьте нужно натуральное число. Полезно бывает если данных много с начало создать нужное количество строк, а потом в них писать, будет значительно быстрее чем писать в них во время добавления.

Теперь давайте добавим уже не пустые строки а строки с данными. Опять же перед нами два пути.

Первый из них мы добавляем массив объектов, к примеру строк. Выглядеть будет так


Grid.Rows.Add(new object[] {"first","second"});

Второй способ


DataGridViewRow row = new DataGridViewRow();
 row.HeaderCell.Value = "Row";
 row.CreateCells(Grid);
 row.SetValues(new object[] { "djaga-djaga", "djuno-djuno" });
 Grid.Rows.Add(row);

Опять таки видим что второй способ более замороченный но дает больше возможностей. Сначала мы создаем экземпляр строки, потом задаем заголовок, для этой строки (будет отображаться как самая левая колонка, можно там сделать нумерацию на пример). методу CreateCell передаем наш DataGridView что бы он очистил содержимое ячеек и можно было установить свои значения, замечу можно не использовать отделать метод SetValues а сразу же в методе CreateCells установить значения ячеек, передавт эти значения вторым параметром, в моем случае это выглядело бы так row.CreateCells(Grid,new object[] { “djaga-djaga”, “djuno-djuno” });

Какой из этих способов подходит вашей задаче, решать тоже Вам)))

Ну и финальный этап это прочитать, данные из DataGridView. В этом примере мы читаем данные в строку data второго столбца каждой ячейки, Заметьте что Grid.Row.Count-1 потому что как только заполняет хотя бы одно поле последней строки, создается еще одно, не забывайте проверять, значения на null, иначе получите Exception в случае если ячейка не будет инициализированна.


string data;
 for (int i = 0; i < Grid.Rows.Count-1; i++)
 {
 data = Grid.Rows[i].Cells[1].Value.ToString();

 }

Еще один способ получения данных из DataGridView с помощью DataGridViewRow


foreach(DataGridViewRow trow in Grid.Rows)
 {
 if (trow.IsNewRow)
 continue;
 for (int i = 0; i < trow.Cells.Count; i++)
 {
 if (trow.Cells[i].Value != null)
 data = trow.Cells[i].Value.ToString();

 }

 }

Ну вот пока и все, далее про таких фишки как Binding, сортировка, работа с контекстным меню, и прочие вкусности без угрозы кариеса я постараюсь рассказать в следующих заметках.

§ 13 Responses to Работаем с DataGridView"

  • Артём пишет:

    Ничего не понял….

    • admin пишет:

      Что именно не понятно, написано скомкано согласен, хотел освятить только ключевые моменты, но если нужно могу переписать более развернуто.

  • Type пишет:

    Неплохо. Сюда бы ещё примеры на С++

    • admin пишет:

      Если Вы имеете ввиду MFC, то наверное вряд ли появится т.к. проектировать GUI на C++ це есть ужос )))

  • Neko пишет:

    Спасибо, очень интересно!

    А не подскажите как реализовать такое с DataBase:

    Есть 2 колонки
    1. Заказ %
    2. В процессе

    Я вписываю в колонке “Заказ №” имя файла, допустим “Test”
    В папке “D:\” каждые 10 сек делается проверка файлов, если в папке “D:\” появится файл с таким же имением как и в колонке “Заказ №” то на против имени в колонке “В процессе” появляется время создания файла ну или текущие время.

    P.s расширение файлов .txt

    Заранее спасибо!

    • admin пишет:

      Даже не знаю как именно ответить на вопрос, по части мониторинга файлов в .NET есть FileSystemWatcher “подпишетесь” на события нужные и в них обновляйте. К примеру в событии можете просматривать колонку с номером заказа и искать соответсвие, если найдено то обновлять время создания. Способов решить эту задачу масса, все зависит о наличии архитектуры в системе либо от её отсутствия.

      • Neko пишет:

        Спасибо за ответ!
        Но суть не в том. Следить за файлами я могу.
        Мне нужно сделать так чтобы, если в папке создается файл с таким же именем как и в строке “заказ” то на против именно того имени в столбике “в процессе” писалось слово, проблема только в этом! Я не знаю как добавить iteam в ту же строку где находится имя заказа!

        • admin пишет:

          Подпишись на эвент DataGridView.CellValueChanged в нем будешь создавать файлы. В остальном не вижу проблему, просто устанавливать значение “в процессе” в соседней ячейке.

  • sergey пишет:

    Очень понравилось.
    Расскажите, как задавать размер ячеек (например: в моём случае для поля bool задаётся размер яче

  • sergey пишет:

    Очень понравилось.
    Расскажите, как задавать размер ячеек (например: в моём случае для поля bool задаётся размер ячейки превышающий размер строки False)
    И тут же второй вопрос: расскажите, как создавать DataGridViewCheckBoxColumn
    и им подобные.
    Спасибо.

  • sergey пишет:

    И to

  • sergey пишет:

    И ещё: в моём случае таблица загружается из csv-файла.
    Как в уже загруженную (отображенную на форме) таблицу добавить новую строку.
    Все данные выбираются из полей на той же форме, что и таблица.
    PS простите за “левые” сообщения

  • Евгений пишет:

    Спасибо за труд, подчерпнул для себя конечно немного, но выяснил именно то, что мне было необходимо в этот момент времени. Как бы смешно это небыло, но немог найти толковую простую строчку :data = Grid.Rows[i].Cells[1].Value.ToString();
    Как то в других источниках она то разбивалась то разбиралась, я 3 часа не мог понять что VS от меня ещё надо ). Вобщем то эт мой частный случай, но я только приступил к изучению и для меня самое вкусное когда просто и понятно изложен материал. Именно по таким блогам, заметочкам и дневничкам собираю пока весь код программы ) Спасибо.

Ответить на Neko Отмена ответа

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Смотреть фильмы онлайн