Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СРС / Автономный режим / 9- Приложение, реализующее отдельный уровень данных

.docx
Скачиваний:
5
Добавлен:
28.06.2021
Размер:
477.12 Кб
Скачать

9

9. Приложение Book.v9, реализующее отдельный уровень данных

В промышленных приложениях используется многоуровневая архитектура (разделение пользовательского интерфейса, бизнес-логики и слоя доступа к данным). Это обеспечивает совместное использование ресурсов и данных различными приложениями.

Можно создать библиотеки, реализующие уровень данных для базы данных Book с использованием различных технологий доступа к данным. Эти библиотеки пригодятся при построении клиентских приложений с использованием ASP.NET, Windows Presentation Foundation, веб-сервисов и других технологий.

Создадим библиотеку данных с использованием типизированного DataSet. Для создания библиотеки слоя данных создадим новый проект Библиотека классов. Назовем проект Book.Data и поместим его в решение Disconnected.

В окне Обозреватель решений в дереве проекта удалите созданный средой по умолчанию файл Class1.cs. После этого откройте окно Источники данных и создайте новый источник данных на основе DataSet, как вы это сделали в предыдущем разделе, за исключением того, что в качестве объектов базы данных используйте набор хранимых процедур, а не таблицы.

Сгенерированный мастером DataSet должен выглядеть в дизайнере так, как показано на следующем рисунке (XSD-файл сгенерированного DataSet).

Далее напишем клиентские приложения, использующие созданную нами библиотеку для доступа к базе данных Book.

Вначале рассмотрим динамическое связывание данных в период выполнения.

Часто в период выполнения требуется модифицировать источник данных, с которым связан некоторый элемент управления. Или, наоборот, иногда необходимо связать элемент управления с источником данных, причем экземпляр этого элемента управления требуется создавать только во время работы программы.

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

Создадим приложение, демонстрирующее динамическое связывание данных с элементами управления и DataSet. Для этого создадим новый проект Windows Forms Application с именем Book.v9, поместив его в решение Disconnected.

Для главной формы приложения используем в качестве основы форму из проекта Book.v6. Проект содержит одну форму Form1. Установим новый заголовок окна формы – Book v9 (свойство Text).

Добавим на форму элемент StatusStrip для отображения строки состояния. В StatusStrip добавим метку StatusLabel с именем lbRecordsCount (свойство Name) для отображения количества записей. Добавим на форму элементы BindingNavigator и BindingSource.

Поместим на форму элемент SplitContainer, в левой части которого распололожим элемент управления TreeView, который будет отображать дерево объектов нашей базы данных, и зададим в его свойстве Dock значение Fill. А в правой части вместо элемента DataGridView поместим контейнерный элемент управления TabControl и зададим в его свойстве Dock значение Fill. C помощью команд контекстного меню, вызываемого ПКМ, удалите созданные по умолчанию вкладки tabPage1 и tabPage2.

Добавим на форму элемент ContextMenuStrip. Назовем его tabContextMenu (свойство Name) и прямо в форме добавим пункты меню (MenuItem), изменив у каждого свойство Text (при этом свойство Name изменится автоматически, как указано в скобках): Close (closeToolStripMenuItem), Close All But This (closeAllButThisToolStripMenuItem), Close All (closeAllToolStripMenuItem). Эту же операцию можно проделать с помощью свойства Items элемента tabContextMenu.

У нас будет приложение типа TDI (Tabbed Document Interface), которое может содержать множество документов с закладками. Выбор первого пункта меню закрывает текущий документ, второго – закрывает все документы кроме текущего, третьего – закрывает все документы

Расположим на форме компонент ImageList, который будет контейнером иконок для элемента TreeView. Поместим в ImageList две иконки для отображения корневого и дочерних узлов дерева. С помощью свойства Images откроем редактор коллекции изображений и поместим туда иконки. Подходящие иконки (Diagram_32XLG.png и table_16xLG.png) можно взять в библиотеке VS 2012 Image Library, которая поставляется вместе с Visual Studio 2012 или скачивается с сайта Microsoft.

В окне Properties для элемента TreeView свяжите свойство ImageList с нашим компонентом imageList1. Дизайн главной формы приложения показан на рисунке.

Для создания окна документа используем пользовательский элемент управления, наследуемый от класса UserControl. Элемент управления UserControl позволяет создавать элементы управления, которые можно многократно использовать в приложении. Добавим UserControl в проект командой Проект / Добавить пользовательский элемент управления и назовем его UCGrid.

На поверхности созданного пользовательского элемента управления разместите DataGridView. Задайте для него свойства:

Name = dgvData;

Dock = Fill;

AllowUserToAddRows = false;

AllowUserToDeleteRows = false;

ReadOnly = true.

В класс UCGrid добавьте свойство DataSource для доступа к одноименному свойству дочернего DataGridView. Код класса UCGrid показан в листинге.

Теперь перейдем к коду главной формы приложения. Скорректируем подключаемые пространства имен в соответствии с листингом приложения.

Чтобы проект Book.v9 знал о функциональности, содержащейся в библиотеке Book.Data, необходимо установить физическую ссылку. Разверните узел References проекта Book.v9. Щелкните ПКМ по элементу References и выберите опцию Добавить ссылку. Щелкните Решение и Проекты. Выберите Book.Data, после чего нажмите кнопку ОК. В результате этих действий проект Book.Data будет добавлен в ссылки проекта Book.v9.

В класс главной формы приложения добавим описание закрытых переменных и констант класса Form1, как показано в листинге.

Создадим обработчик события Load главной формы. В теле обработчика события Load формы напишем код инициализации объектов DataSet, адаптеров данных и дерева объектов базы данных, а также привязку навигатора к объекту BindingSource, как показано в листинге.

Создадим для элемента treeView1 обработчик события AfterSelect выбора узла в дереве объектов базы данных. Основной код будет содержаться в этом обработчике события (см. листинг).

Создадим обработчик события SelectedIndexChanged выбора закладки элемента управления tabControl1. В этом обработчике события напишем код в соответствии с листингом.

Создадим обработчик события Click элемента контекстного меню closeToolStripMenuItem. В обработчике события напишем код в соответствии с листингом.

Создадим обработчик события Click элемента контекстного меню closeAllButThisToolStripMenuItem. В обработчике события напишем код в соответствии с листингом.

Создадим обработчик события Click элемента контекстного меню closeAllToolStripMenuItem. В обработчике события напишем код в соответствии с листингом.

Резюме

Решаемая задача – чтение данных из всех таблиц базы данных. Приложение работает в отсоединенном режиме. Несмотря на наличие навигатора, модификация данных в таблицах не поддерживается. Для этого необходимо дописать большой объем кода с использованием обращений к хранимым процедурам INSERT, UPDATE, DELETE.

Достоинства приложения:

  • не используется постоянное соединение с базой данных;

  • приложение эффективно отображает данные всех таблиц базы данных в виде множества документов с закладками;

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

Недостатки приложения:

  • приложение не позволяет модифицировать данные в таблицах;

  • названия полей объектов базы данных могут иметь не очень понятные для пользователя имена;

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