[Delphi] Работа с DBGrid
В статье будут описаны простые приёмы работы с DBGrid, которых достаточно для большинства случаев работы с базами данных в Delphi.
Как с ним работать вообще
Для тех, кто может работать с DBGrid, эта часть бесполезна. Теперь остальные.
Для начала нам нужен компонент DataSource (вкладка Data Access). DataSource только предоставляет данные в удобном для других компонент виде, вытягивать их из базы данных (или ещё откуда) должен другой компонент. Он указывается в поле DataSet нашего DataSource.
Создаем DBGrid. У него в поле DataSource вешаем угадайте что и добавляем столбцы. Для каждого столбца нам важны поля FieldName (имя поля) и Title/Caption (текст заголовка). И всё... Теперь пользователь может менять данные в таблице и изменения будут автоматически сохраняться в БД.
Combobox в DBGrid
Судя по многочисленным предлагаемым вариантам в интернете, мало кто знает, что DBGrid и без всяких надстроек поддерживает механизм combobox'ов. Только от спрятан. Тут два способа добавить combobox в DBGrid.
Combobox с фиксированым списком вариантов
В столбце находим поле PickList и вбиваем туда варианты. И всё. Обратите внимание, что в БД сохраняется текст выбраной стоки, поэтому и поле должно быть текстовым. В примере это поле "Состояние".
Combobox с подгрузкой списка вариантов из БД
Чтобы добавить такой combobox в DBGrid нужно... не трогать его. Вместо этого мы ищем в дереве объектов объект Fields, принадлежащий нашему источнику данных. Тыкаем в него правой кнопкой и выбираем сначала "Add all fields", а затем "New field".
В окошке заполняем:
Name - имя нового поля.
Type - тип поля. Скорее всего "String".
Field type - выбираем Lookup.
Key fields - внешний ключ в нашей таблице.
DataSet - дополнительная таблица.
Lookup keys - ключевое поле дополнительной таблицы.
Result field - поле, которое будет отображаться в combobox.
Маска ввода данных
Также данные можно фильтровать при помощи маски, которая задается в поле EditMask объекта, соответствующего нужному полю. Там есть несколько готовых масок для даты, времени и всего такого. В примере это используется для поля "Дата смерти".
Изменение данных
Добавление записи
Запись можно добавить вот такой строкой:
DBGrid1.DataSource.DataSet.Insert;
DBGrid1.DataSource.DataSet - это ссылка на источник данных (у меня - на объект Bodies). В таком длинном виде стоит записывать на случай, если вдруг захочется изменить источник данных. Если захочется как-то обработать данные сразу после создания, то обработку стоит вешать на обработчик события OnNewRecord нашего источника данных, а не сразу после Insert. В противном случае пользователь может добавить запись, выбрав последнюю строку и нажав кнопку вниз - тогда ваш код не выполнится.
Удаление записи
Тут всё просто. Единственное, на что стоит обратить внимание - есть ли вообще что удалять.
if not DBGrid1.DataSource.DataSet.Eof then DBGrid1.DataSource.DataSet.Delete;
Сохранение записи
Последнее, на что я советую вам обратить внимание - закрытие формы. Пользователь может добавить запись, все вписать и, довольный собой, закрыть форму. Поскольку на другую запись курсор он не переключал, DBGrid не знает, что можно уже сохранять изменения в БД, и запись не добавиться. Мелочь, но очень неприятно и намекает на криворукость программиста. Чтобы сохранить нашу криворукость в тайне, нужно на обработчик закрытия формы добавить такие строки:
if DBGrid1.EditorMode or DBGrid1.DataSource.DataSet.Modified then DBGrid1.DataSource.DataSet.Post;
Теперь программа будет при закрытии сохранять изменения, если это нужно.
Заключение
Вот тут лежит программа-пример. Хочу обратить ваше внимание, что я в ней написал всего 8 строк кода. Вот бы всё в нашей работе было так просто...
Обновлено 07.05.2011 23:50
Комментарии
Заранее благодарен.
Это урегулировка длинны поля
DBGrid1.Columns[0].Width := 100;
DBGrid1.datasource.dataset.Post;
выдает ошибку cliendataset not insert or edit mode
и ничего не сохраняеться в базе данных. как правильно сделать??
спасибо попробую
RSS лента комментариев этой записи