23 января 2010 г.

Использование DataGridView в приложениях на .NET

Наверное многие кто сталкивался с необходимостью создания небольшой СУБД на .NET знают, что в сети довольно трудно найти универсальный пример такой программы. Казалось бы несложная задача, но на практике она выливается в десяток методов с SQL запросами, которые будут «падать» при любом удобном случае. А стоит изменить в базе данных название одной колонки в таблице, или добавить новую — придется изменить каждый запрос вручную, а то и вовсе переписать заново все методы. Я сам столкнулся с подобной проблемой, но пошарив по MSDN-у и разным форумам, нашел изящный и удобный шаблон с использованием контрола DataGridView.

И так, задача:

  • Создать небольшую базу данных с одной таблицей.
  • Написать программу на платформе .NET позволяющую просматривать содержимое этой базы, а так же редактировать, добавлять и удалять в ней записи.
  • При этом, мы не напишем ни одного SQL запроса.

Те несколько строчек кода, которые нам понадобятся, мы напишем на C# (думаю любители бэйсика или др. языков их без труда расшифруют). Итак, начнём.

Для начала нам нужна небольшая база данных. Думаю, почти у каждого дома установлен Microsoft Office, в который входит неплохая СУБД Access (я использую версию 2007), которую, к тому же, еще и в многих школах изучают :) Так что будем использовать её. Откройте Access и создайте новую базу данных. Сохраните её под именем “Database.mdb” в формате Access 2000-2003 (и желательно запомните место куда вы её сохранили :)). Добавьте новую таблицу и назовите её, к примеру, Students (больная тема :)). В режиме Design View добавьте следующие поля:

Название Тип Описание
Id AutoNumber Ключевое поле
Name Text ФИО студента
Group Text Группа

Если Access будет ругаться, что слова Name и Group зарезервированы — не обращайте внимания. Можете перейти в Datasheet View для интереса и ввести пару значений.

Конечно, третьей-нормальной-формой тут и не пахнет, но мы к этому и не стремились. Небольшая БД готова, приступаем к программе.

Создайте новый проект типа Windows Forms Application (я использую Visual Studio 2008) и сохраните его. В окошке Solution Explorer добавьте к проекту новую папку (Add — New Folder) и назовите её, к примеру, “Data”. Щелкните п.к.м. по этой папке и выберите пункт Add — Existing Item, в диалоге выбра файла найдите сохраненную ранее базу данных “Database.mdb” (убедитесь, что при этом вы закрыли её в MS Access). Обратите внимание, что Visual Studio теперь скопирует этот файл в корневую папку проекта. Откроется мастер конфигурации Data Source, — а это как раз то, что нам нужно. На вопрос какие базы данных вы хотите использовать в dataset-е, отметьте галочкой пункт Tables и нажмите Finish. В папке с базой данных теперь находится особый класс — dataset, который будет выступать посредником между нашей программой и базой данных. Кликните по созданному dataset-у “DatabaseDataSet.xsd” в окне Solution Explorer и вы увидите его графическое представление. Сейчас в нём можно изменить названия колонок — поменяйте их на соответственно «Номер», «ФИО» и «Группа». И еще не помешает установить свойство ReadOnly в true для колонки «Номер». Теперь сохраните изменения и вернитесь на вкладку с главной формой. Единственный контрол, который нам понадобится — это DataGridView, перетащите его с панели инструментов Toolbox на форму. Справа от созданного контрола будет мелькать окно-помощник, оно нам сейчас понадобится. Поставьте в нём все галочки и нажмите на кнопку Dock in parent container. Контрол растянется на все окошко. Там же обратите внимание на пункт Choose Data Source. Найдите в нём нашу таблицу Students. Как только вы её выберете, Visual Studio создаст еще несколько вспомогательных компонентов внизу формы, а в самом DataGridView отобразятся 3 колонки из таблицы. Программа почти готова — уже сейчас её можно скомпилировать и запустить. В ней можно будет добавлять новые записи, удалять или изменять старые. Но есть один нюанс.

Привязка DataGridView к базе данных работает в режиме чтения и все изменения, которые вы проделаете в DataGridView, не повлияют на базу данных. Даже если вы удалите всех студентов кнопкой Delete. Потому наша следующая задача — синхронизировать DataGridView с базой данных так, чтобы все изменения немедленно сохранялись в неё. Во многих блогах и статьях о DataGridView это предлагают делать создавая собственные SQL запросы для удаления, обновления и добавления студентов. Но за нас уже все сделала Visual Studio и ADO.NET, остаётся только добавить в текст программы одну строчку —

studentsTableAdapter.Update(databaseDataSet.Students);

Эта универсальная команда будет каждый раз обновлять базу данных, когда пользователь закончит редактирование какого-либо поля, удалит или добавит новое. На вопрос, в обработчик какого именно события нужно её помещать, можно ответить по-разному. Это уже зависит от конкретной задачи, личных предпочтений. Я обычно помещаю эту строку в обработчик события CellValidated (его можно создать кликнув мышкой по соответствующему пункту списка событий в окне Properties). Не забудьте позаботиться об ещё одном важном свойстве: выделите файл базы данных в Solution Explorer-е, и в окне Properties измените значение параметра Copy To Output Directory на Copy if newer. В этом случае изменённая в процессе работы программы база данных не будет затираться старой при каждой компиляции.

Вот и всё — теперь можно запускать и гордиться, ваша собственная мега-СУБД готова к работе! За бортом осталось много вопросов (например, правильная обработка ошибок, использование нескольких таблиц с отношениями), но они уже выходят за рамки нашей скромной цели.

Удачного кодинга!

Комментариев нет:

Отправить комментарий