- •Лабораторная работа 5 - Быстрое создание пользовательского интерфейса посредством связывания с данными
- •Этап 1. Добавление простых связанных элементов управления в форму
- •Этап 5. Передача изменений
- •Этап 6. Просмотр дочерних данных
- •Этап 7. Совершенствование пользовательского интерфейса
- •Улучшенный формат для числовых значений и столбцы на основе выражения (название_модели и суммаИтого), предназначенные для отображения на экране полезных расчетных значений.
- •Задания для самостоятельной работы.
Этап 5. Передача изменений
Добавим на навигатор кнопку “Сохранить” для передачи изменений в БД
-
Для добавления нового элемента выберите элемент управления BindingNavigator. На нем справа от последнего элемента появится маленькая направленная вниз стрелочка. Нажмите эту стрелку и вы увидите список всех доступных элементов (Button, Label и других). Добавьте новый элемент Button, задайте ему Свойство DisplayStyle=Text, Cвойство text = Сохранить.
-
Добавьте в событие «Щелчок по кнопке Сохранить» соответствующий обработчик. (если необходимо измените имен ЭУ так как они называются у вас)
Me.Validate
Me.BindingSource1.EndEdit()
Me. ЗаказTableAdapter.Update(me.Mmm_sqlDataSet)
1-ая строка = После вызова метода Validate форма проверяет достоверность данных.
2-ая строка = Благодаря объекту BindingSource можно соответственно записывать или пропускать изменения с помощью методов EndEdit или CancelEdit. При переxоде к другой записи будет неявно вызван метод EndEdit, если изменения были внесены через связанные элементы управления.
3-ая строка = метод Update передает отложенные изменения, хранимые в объекте DataTable.
Этап 6. Просмотр дочерних данных
На данном этапе приложение позволяет просматривать и изменять данные таблицы Заказы. Доработаем форму так, чтобы можно было работать с составом заказов.
-
Откройте в конструкторе класс DataSet со строгим контролем типов (созданный на 1-ом этапе данной лабораторной работе) – это можно сделать, например, дважды щелкнув по объекту DataSet в окне SolutionExplorer.
-
Конструктор класса DataSet со строгим контролем типов автоматически добавляет объект DataRelation между двумя таблицами DataSet, но не связывает новый объект DataRelation с объектом ForeignKeyConstraint. Дважды щелкните объект DataRelation между таблицами Заказ и Состав_заказа в конструкторе, выберите опцию Both Relation And Foreign Key Constraint и задайте свойствам Update Rule и Delete Rule значения Cascade.
-
Закройте конструктор окна DataSet с сохранением
-
Теперь посмотрите содержимое объекта DataSet со строгим контролем типов в окне Data Sources. Вы увидите два отдельных узла состав_заказа, как на рисунке 18: один из узлов — брат, а второй — сын узла «Заказ».
Рисунок 18 – Источник данных
Если пытаться перетащить один из узлов на форму, то произойдет создание объектов DataGndView, TableAdapter, BindingSource для работы с составом_заказов. Разница между показанными на рисунке двумя объектами состоит в том, что при перетаскивании узла состав_заказа БРАТ элемент управления DataGridView выводит на экран все записи таблицы состав_заказа. Если перетащить узел состав_заказа, который приходится узлу заказ сыном, то в DataGridView выводится на экран будут только записи таблицы состав_заказа для нужного нам заказа.
ПОЭТОМУ перетащите на вашу форму объект-сын состав_заказов.
-
Для объекта DataSet необходимо, чтобы записи в таблице состав_заказа соответствовали выбранному в данный момент в верхней части формы значению таблицы Заказ. Попробуйте запустить форму. Запустив форму в таком виде, как мы сейчас ее сделали, вы получите сообщение об исключительной ситуации. Чтобы указанного сообщения не было, необходимо изменить код таким образом, чтобы код для получения информации о составе заказа появлялся после запроса информации о заказе. Откройте код события Load формы, и исправьте код следующим образом (возможно имена объектов у вас будут другими). Порядок вызова метода Fill должен быть именно таким (сначала для родительской Заказ, потом для дочерней состав_заказов)
Me.ЗаказTableAdapter.Fill(Me.Mmm_sqlDataSet3.заказ)
Me.Состав_заказаTableAdapter.Fill(Me.Mmm_sqlDataSet3.состав_заказа)