Лекция № 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 выполняют раскрашивания строк ? Приведите пример раскрашивания строки сетки.