Лекция № 11

Тема: «Работа с сеткой для отображения данных»

 

План

1. Основные свойства сетки

2. Работа с колонками сетки

3. Задание типов колонок

4. Условное форматирование сетки

5. Программная настройка пути к БД

 

1. Основные свойства сетки

Компонент DataGridView служит для отображения данных в виде таблицы. Компонент может отображать и позволять редактировать как обычные данные, так и данные из БД.

Компонент имеет свойства:

 

Свойство

Описание

Name

Имя компонента для обращения к нему в коде

AllowUserToAddRows Включает возможность добавления новой строки в конец сетки без кода. Будет отображаться в конце пустая строка
AllowUserToDeleteRows Включает возможность удаления строки. Можно щелчком слева от строки выделить ее и нажать Delete. Запрос на удаление не появляется
AllowUserToOrderColumns Включает возможность изменять порядок колонок. Можно перетащить колонку за ее заголовок в нужное место
AllowUserToResizeColumns Включает возможность изменения ширины колонок
AllowUsetToResizeRows Включает возможность изменения высоты строк
AlternatingRowsDefaultCellStyle Задает формат ячеек только для четных строк сетки по умолчанию. Появится новое окно, в котором можно задать цвет фона и текста, цвет фона и текста выделенной ячейки, шрифт, выравнивание текста и т.п.
AutoSizeColumnsMode Задает режим автоматической установки ширины для колонок. Может принимать значения: ColumnHeader - по длине текста в заголовках, AllCellsExceptHeader - по длине текста в в ячейках без учета заголовков, AllCells - по длине текста во всех  ячейках, Fill - подгонка ширины колонок так, чтобы они заполнили всю ширину сетки
AutoSizeRowsMode Задает режим автоматической установки высоты для строк. Может принимать такие же значения, то и для колонок. Нет значения Fill.
CellBorderStyle Задает отображение границ у ячеек. Можно отобразить только вертикальные, только горизонтальные или обе разделительные линии в сетки. Можно скрыть все линии.
ColumnHeadersBorderStyle Задает отображение границ у ячеек заголовка колонок сетки
ColumnHeadersDefaultCellStyle Задает формат ячеек только для заголовка колонок таблицы
ColumnHeadersHeight Задает высоту ячеек заголовка колонок таблицы
ColumnHeadersVisible Включает/выключает отображение заголовка колонок сетки
Columns Коллекция колонок сетки. Можно добавлять, удалять колонки, изменять их порядок. Для каждой колонки можно задавать множество свойств. Работа с колонками будет рассмотрена ниже.
DataSource Ссылка на компонент BindingSource, который является источником данных для сетки
DefaultCellStyle Задает формат для всех ячеек сетки по умолчанию.
EditMode Задает способ перехода в режим редактирования сетки. Может принимать значения: EditOnEnter - по нажатию на клавишу Enter, EditOnKeyStroke - автоматически при начале набора с клавиатуры, EditOnKeyStrokeOrF2 - автоматически при начале набора с клавиатуры или нажатии на F2, EditOnF2 - при нажатии на F2
GridColor Цвет линий сетки
ReadOnly Включает/выключает блокировку сетки для изменения данных с клавиатуры.
RowHeadersDefaultCellStyle Задает формат для ячеек заголовка строк таблицы (отображаются слева от строк)
ColumnHeadersVisible Включает/выключает отображение заголовка строк сетки
RowsHeadersWidth Задает ширину ячеек заголовка строк таблицы
RowsDefaultCellStyle Задает формат ячеек только для заголовка строк таблицы
ScrollBars Указывает, какие строки прокрутки будут отображаться в сетке
SelectionMode Задает способ выделения ячеек в сетке. Может принимать значения: CellSelect - выделение любого диапазона ячеек с помощью мыши, FullRowSelect - автоматическое выделение всей строки FullColumnSelect - автоматическое выделение всей колонки, RowHeaderSelect - выделение при щелчке на заголовке строки, ColumnHeaderSelect - выделение при щелчке на заголовке колонки.
ShowCellErrors Включает отображение ошибок при вводе в ячейку
ShowCellToolTips Отображение всплывающих подсказок в ячейках. Если текст в ячейке не помещается, то его можно просмотреть во всплывающей подсказке
ShowEditingIcon Отображает слева от строки иконку перехода в режим редактирования
ShowRowErrors Включает отображение ошибок при ввода в строку
StandardTab Включает возможность перехода по ячейкам сетки клавишей Tab

 

2. Работа с колонками сетки

Каждая сетка имеет колонки. При этом колонки могут быть как связаны с полями таблицы БД, так и быть пустыми. Для работы со списком колонок используют отдельную форму, которая вызывается с помощью свойства Columns сетки. Форма имеет вид:

 

 

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

Каждая колонка имеет свойства, которые отображаются в правой части формы. При этом набор свойств может отличаться в зависимости от типа колонки (текстовое поле, выпадающий список, колонка-кнопка, колонка с изображениями и т.п.). На рисунке показаны свойства для колонки в виде текстового поля:

 

Свойство

Описание

Name Имя колонки для обращение к ней в коде

AutoSizeMode

Задает тип автоматической настройки ширины колонки. Может принимать такие же значения, что и свойство AutoSizeColumnsMode сетки

ColumnType Задает тип колонки. Может принимать значения: DataGridViewTextBoxColumn - колонка в виде текстового поля, DataGridViewCheckBoxColumn - колонка в виде флажка, DataGridViewComboBoxColumn - колонка в виде выпадающего списка, DataGridViewImageColumn - колонка для отображения графики, DataGridViewLinkColumn - колонка для отображения гиперссылки
DataPropertyName Имя поля из набора данных для отображения в колонке
Frozen Включает закрепление колонки в сетке при горизонтальном скроллинге. Такие колонки нужно перемещать в начало сетки. При горизонтальном скроллинге они будут оставаться фиксированными.
HeaderText Текст заголовка колонки в сетке
MaxInputLength Максимальная длина текста, которую можно ввести в колонке
ReadOnly Блокирует колонку для ввода
Resizeble Включает/выключает возможность изменения ширины колонки в сетке
Visible Отображает/скрывает колонку в сетке
Width Ширина колонки в пикселях

 

Обращение к колонке, строке, ячейке сетки

Рассмотренные свойства можно задавать как при конструировании формы, так и в коде. При этом нужно уметь обращаться к нужной колонке сетки. Для обращения к колонке сетки можно использовать запись:

 

dataGridView1.Columns[i]

'

где i - номер колонки (нумерация с 0).

 

После этого, можно для колонки задать любое свойство. Например:

 

//первую колонку делаем невидимой

dataGridView1.Columns[0].Visible=false;

//седьмую колонку окрашиваем цветом

dataGridView1.Columns[6].DefaultCellStyle.BackColor = Color.LightBlue;

 

Для обращения к нужной строке используют команду вида:

 

dataGridView1.Rows[i]

'

где i - номер колонки (нумерация с 0).

 

После этого, можно для колонки задать любое свойство.  Например:

 

//для первой строки сетки задали цвет фона

dataGridView1.Rows[0].DefaultCellStyle.BackColor = Color.LightBlue;

 

Для обращения к нужной ячейки использую команду вида:

 

dataGridView1.Rows[номер_строки].Cells[номер_колонки]

 

После этого, можно для колонки задать любое свойство.  Например:

 

//для третьей ячейки в первой строке присваиваем текст

dataGridView1.Rows[0].Cells[2].Value="Пример текста";

 

Замечание: если сетка связана с таблицей БД, то присвая данные ячейкам, можно изменять данные в БД.

 

Обращение к текущей колонке, строке, ячейке сетки

Если пользователь щелкнул на ячейке сетки, то часто нужно узнать, на каком столбце , строке или ячейке выполнен щелчок.

 

Для определения текущей ячейки использую команду вида:

 

dataGridView1.CurrentCell

 

После этого, можно для колонки задать любое свойство.  Например:

 

//для текущей ячейки присваиваем текст

//следите, чтобы тип присваиваемых данных

//совпадал с типом поля в таблице БД

dataGridView1.CurrentCell.Value="Пример текста";

 

Для определения номера текущей колонки использую свойство  dataGridView1.CurrentCell.ColumnIndex.

Например, условие вида:

 

if (dataGridView1.CurrentCell.ColumnIndex == 1)

. . .

 

проверяет, щелкнул ли пользователь на второй колонке.

Обратиться к активной колонке можно с помощью записи:

 

dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex]

 

Для определения номера текущей строки использую свойство  dataGridView1.CurrentCell.RowIndex.

Например, условие вида:

 

if (dataGridView1.CurrentCell.RowIndex == 1)

. . .

 

проверяет, щелкнул ли пользователь на второй строке.

Обратиться к активной строке можно с помощью записи:

 

dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex]

 

3. Задание типов колонок

Для защиты колонок от ошибок ввода целесообразно вместо обычной колонки в виде текстового поля использовать другие: выпадающие списки, календари, флажки и т.п.

 

Создание колонки в виде раскрывающегося списка

Если значение поля таблицы может принимать одно из значений некоторого фиксированного набора (например, пол (м/ж), день недели (Пн - Вс), месяц (Янв - Дек), разряд (I - VI) и т.п.), то для такой колонки можно создать список с перечнем допустимых значений. Для этого откройте свойство Column сетки, выделите колонку нужного поля таблицы, в свойстве ColumnType выберите значение DataGridViewComboBoxColumn. В результате набор свойств колонки изменится, и появится свойство Items, в котором введите перечень значений для выпадающего списка. Свойство DisplayStyle установите в значение Nothing, это позволит показывать выпадающий список не постоянно, а только после перевода курсора в эту колонку.

Если набор значений для колонки с выпадающим списком заранее не известен и берется из таблицы-справочника, то в этом случае нужно задать для колонки следующие свойства:

DataSource - ссылка на BindingSource, связанный с таблицей-справочником;

DisplayMember - имя поля из таблицы-справочника. данными которого будет заполнен выпадающий список;

ValueMember - имя поля из таблицы-справочника, по которому она связана с основной таблицей в БД.

 

Создание колонки для отображения графической информации

Если колонка сетки связана с полем таблицы БД, предназначенным для хранения графической информации, то такая колонка автоматически принимает нужное форматирование и в ней отображается часть хранимого изображения или изображения, указывающего, что поле в БД пустое.

Для более корректного отображения графики в такой колонке откройте свойство Columns сетки, выделите поле с графической информацией и задайте свойства: ColumnType = DataGridViewImageColumn (скорее всего, оно уже будет задано корректно), ImageLayout = Zoom (для масштабирования изображения в ячейках сетки).

Редактирование ячеек такой колонки выполнять лучше всего через вспомогательную страничную форму (пример будет рассмотрен на практическом занятии).

 

Создание колонки в виде раскрывающегося календаря

Если в колонке сетки отображается поле таблицы БД типа Дата/Время, то для защиты такого поля от ошибок ввода, целесообразно заполнять его с помощью выпадающего календаря. По умолчанию колонки в сетке не имеют подходящего типа, но на сайте Microsoft представлен класс для колонок такого типа, который нужно вручную добавить в проект. Для этого необходимо:

- скачать архив с классом DataGridViewCalendarColumn;

- в контекстном меню проекта выберите команду "Добавить - Существующий элемент" и укажите файл класса на диске. В результате в структуре проекта появится новый файл DataGridViewCalendarColumn.cs. Откройте его и в строке namespace укажите такое же имя пространства имен, что и в коде вашей формы;

- запустите программу на выполнение. В результате добавленный файл класса будет скомпилирован и готов к использованию;

- откройте свойство Columns сетки, выберите нужную колонку и задайте для нее свойство ColumnType = DataGridViewCalendarColumn.

Теперь в ячейках колонки при редактировании будет появляться раскрывающийся календарь.

 

4. Условное форматирование сетки

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

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

 

dataGridView1.Rows[i].DefaultCellStyle.BackColor = цвет;

 

где i - номер строки в сетке (нумерация с 0).

При этом применяется следующее правило:

- сначала проверяется условие на пустое значение в поле таблицы БД и задается форматирование для него;

- затем поочередно проверяются остальные условия.

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

 

Пример. Пусть в таблице БД имеется поле oklad, которое отображается в 7 колонке сетки. Строки, в которых размер оклада более 1000, залить светло-зеленым цветом, остальные - светло-синим, пустые значение - белым. В событии RowPrePaint сетки  напишем код:

 

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)

{

//если 7-я колонка пуста(соответствует полю "oklad", нумерация с 0)

if (dataGridView1.Rows[e.RowIndex].Cells[6].Value == DBNull.Value)

    //закрашиваем белым цветом

    dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;

//если оклад > 1000

else if (Convert.ToDouble(dataGridView1.Rows[e.RowIndex].Cells[6].Value) >= 1000)

    //закрашиваем светло-зеленым

    dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGreen;

else

    //иначе, закрашиваем светло-синим

    dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightBlue;

}

 

5. Программная настройка пути к БД

При настройке подключения к БД мы рассматривали ситуацию, когда пароль к БД добавляется к строке подключения в коде программы. При этом сам файл БД находится в папке с приложением. Такой способ организации доступа к БД подходит только для локальных информационных систем, когда с БД работает только один пользователь. Если нужно иметь возможность размещать БД в произвольной папке, в том числе и в общей сетевой папке для многопользовательского доступа, то необходимо реализовать возможность задания и сохранения пути к БД. При этом нужно определится со способом хранения пути к БД. Это могут быть INI файл, реестр Windows или файл конфигурации приложения.

Пример. Рассмотрим пример настройки пути к БД с помощью INI файла. При этом для работы с INI файлами нужно скачать класс INIFile.cs и добавить его в проект.

Пусть база данных sotr защищена паролем "123" и подключена к проекту, и  через строка подключения сохранена в файле конфигурации приложения под именем sotrConnectionString.

После этого в событии Load формы перед методами Fill, которые загружают данные из БД нужно ввести код:

 

 private void Form1_Load(object sender, EventArgs e)

{

//создаем объект для работы с INI файлом

//файл находится в папке с проектом под именем settings.ini

INIFile ini = new INIFile(Application.StartupPath + "\\settings.ini");

//описываем переменную для хранения пути к БД

//и считываем в нее значение из INI файла

string path = ini.IniReadValue("Baza", "path", "");

//если считанный в переменную путь к файлу не существует

if (!File.Exists(path))

    //открываем диалог выбора БД

    if (openFileDialog1.ShowDialog() == DialogResult.OK)

    {

        //записываем новый путь в переменную

        path = openFileDialog1.FileName;

        //сохраняем значение переменной в INI файл

        ini.IniWriteValue("Baza", "path", path);

    }

    //если пользователь отказался от выбора БД

    else

        //завершаем работу приложения

        Application.ExitThread();

//настраиваем параметры подключения

//параметру "sotrConnectionString" присваиваем строку подключения

//вместо имени БД подставляем переменную path

Properties.Settings.Default["sotrConnectionString"] = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Jet OLEDB:Database Password=123";

//отображаем главную форму поверх остальных окон

TopMost = true;

TopMost = false;

 

Пример. Рассмотрим пример настройки пути к БД с помощью файла конфигурации приложения. Для этого необходимо создать отдельный параметр для хранения пути к БД. В структуре проекта найдите и откройте файл Properties\Setting.settings. Появится таблица с перечнем параметров приложения. Добавьте новый параметр: имя = path, тип = string, область = Пользователь.

Пусть база данных sotr защищена паролем "123" и подключена к проекту, и  через строка подключения сохранена в файле конфигурации приложения под именем sotrConnectionString.

После этого в событии Load формы перед методами Fill, которые загружают данные из БД нужно ввести код:

 

private void Form1_Load(object sender, EventArgs e)

{

//описываем переменную для хранения пути к БД

//и считываем в нее значение параметра path

string path = Properties.Settings.Default["path"].ToString();

//если считанный в переменную путь к файлу не существует

if (!File.Exists(path))

    //открываем диалог выбора БД

    if (openFileDialog1.ShowDialog() == DialogResult.OK)

    {

        //записываем новый путь в переменную

        path = openFileDialog1.FileName;

        //сохраняем значение переменной в параметр path

        Properties.Settings.Default["path"] = path;

        Properties.Settings.Default.Save();

    }

    //если пользователь отказался от выбора БД

    else

        //завершаем работу приложения

        Application.ExitThread();

//настраиваем параметры подключения

//параметру "sotrConnectionString" присваиваем строку подключения

//вместо имени БД подставляем переменную path

Properties.Settings.Default["sotrConnectionString"] = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Jet OLEDB:Database Password=123";

//отображаем главную форму поверх остальных окон

TopMost = true;

TopMost = false;

 

 

Вопросы для самопроверки

1. Опишите основные свойства сетки DataGridView.

2. Опишите основные свойства отдельной колонки в сетке DataGridView.

3. Как можно в программе обратиться к нужной колонке, строке, ячейке в сетке DataGridView?

4. Как можно в программе обратиться к текущей колонке, строке, ячейке в сетке DataGridView?

5. Как в сетке  DataGridView для колонки сетки создать раскрывающийся список, раскрывающийся календарь?

6. В каком событии сетки  DataGridView выполняют раскрашивания строк ? Приведите пример раскрашивания строки сетки.