Участник Элементы управления Базами данных. C#. ADO.NET 29.02.2016 Связывание данных с элементами управления ComboBox и DataGrid Продолжим работу на примере готовой БД Northwind. В этом упражнении создадим проект, в котором содержимое поля CompanyName таблицы Customers (заказчики) будем загружать в раскрывающийся список ComboBox, а при выборе определенного элемента списка связанные с соответствующей записью данные другой таблицы ( Orders — заказы) будем отображать пользователю в элементе управления DataGrid. Отображение данных на одной форме Для двух разных таблиц нам понадобятся два поставщика OleDbDataAdapter и два набора данных DataSet. Элементы управления ComboBox и DataGrid свяжем с наборами данных через их свойство DataSource. Для ComboBox нужно дополнительно еще связать свойства DisplayMember и ValueMember с соответствующими полями ( CompanyName и CustomerID ) подключенной таблицы Customers, а для DataGrid указать таблицу Orders в свойстве DataMember. При выборе пользователем элемента списка значение CustomerID будет передаваться как параметр в команду поставщика данных, связанного с таблицей Orders, который загрузит из БД в набор нужные записи для отображения их в DataGrid. Если пользователь редактировал данные в DataGrid, то при смене записи в ComboBox эти данные нужно сохранить в БД. Для этого нужно создать соответствующую SQL-команду для поставщика. Добавьте к решению командой Добавить/Создать проект (Add/New Project) новый проект типа Windows Forms Application с именем FormsADO2 рис 1 Прежний проект FormsADO исключите из решения командой Удалить (Remove) http://vitcs.ru Компьютерное образование для всех 1/10 Участник Элементы управления Базами данных. C#. ADO.NET 29.02.2016 рис 2 Проделаем знакомые нам действия из занятия СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА БАЗЫ ДАННЫХ. C#. ADO.NET Поместите в рабочую область оболочки компонент OleDbDataAdapter, соедините его с файлом учебной базы данных Northwind.mdb(ссылка на скачивание) корпорации microsoft. На предложение оболочки скопировать файл БД в проект ответьте Да. рис 3 Настройте его только на чтение(кнопка Дополнительно) полей CustomerID и CompanyName таблицы Customers (заказчики), используя построитель Построитель запросов(Query Builder), как это мы делали ранее в предыдущем упражнении. рис 4 Выставите свойства БД Копировать в выходной каталог в положение Копировать более позднюю версию. Выделите поставщик oleDbDataAdapter1 и командой меню Создать набор данных(Generate Dataset) создайте для него класс DataSet1 и объект набора данных с автоматически сгенерированным именем dataSet11 http://vitcs.ru Компьютерное образование для всех 2/10 Участник Элементы управления Базами данных. C#. ADO.NET 29.02.2016 рис 5 Поместите на форму новый поставщик OleDbDataAdapter с именем oleDbDataAdapter2 для таблицы Orders (заказы), в его настройках учтите все возможности взаимодействия с данными, а в команде SELECT предусмотрите передачу значения параметра по полю CustomerID и сортировку по дате выбранных из БД данных. Для правильного формирования команды используйте окно Построитель запросов(Query Builder). рис 6 Обратите внимание, как в каком порядке мы визуально формируем в Построитель запросов(Query Builder), условие выборки по параметру CustomerID: вначале отмечаем поле CustomerID в верхней вкладке окна мастера, чтобы это поле появилось во второй вкладке, далее прописываем фильтр =?, а затем в этой же второй вкладке снимаем флажок Вывод(Output) со столбца CustomerID, чтобы не включать его данные поставщиком. С помощью oleDbDataAdapter2 мы предполагаем менять данные, поэтому все разрешения чтения записи оставляем включенными (кнопка Дополнительно…). http://vitcs.ru Компьютерное образование для всех 3/10 Участник Элементы управления Базами данных. C#. ADO.NET 29.02.2016 рис 7 Выделите поставщик oleDbDataAdapter2 и командой меню Создать набор данных(Generate Dataset) создайте для него класс DataSet2 и объект набора данных с автоматически сгенерированным именем dataSet21 рис 8 Поместите на форму компоненты Label, ComboBox и DataGrid (если их нет в палитре Toolbox, добавьте к соответствующей вкладке командой контекстного меню Choose Items ), рис 9 разместите их в соответствии с рисунком и настройте согласно приведенной таблице свойств: http://vitcs.ru Компьютерное образование для всех 4/10 Участник рис 10 Компонент Элементы управления Базами данных. C#. ADO.NET Свойство 29.02.2016 Значение Label Text Заказчики ComboBox (Name) cbCustomers DataSource dataSet11 DisplayMember Customers.CompanyName DataGrid ValueMember Customers.CustomerID (Name) dgOrders DataSource dataSet21 DataMember Orders CaptionText Заказы для выбранного заказчика Создайте для формы Form1 обработчик события Load, двойным «кликом» по заголовку формы и заполните его следующим кодом: рис 11 Запустите проект и испытайте работу приложения, форма запускается, но работает не корректно, необходимо создать обработчик события SelectedIndexChanged. В свойствах объекта ComboBox в режиме События , выбираем события SelectedIndexChanged и двойным «кликом» переходим к написанию кода; http://vitcs.ru Компьютерное образование для всех 5/10 Участник Элементы управления Базами данных. C#. ADO.NET 29.02.2016 рис 12 Теперь приложение работает, как надо. рис 13 Отображение связанных подробностей на дополнительной форме В предыдущем разделе мы просматривали отфильтрованные записи дочерней таблицы Orders (заказы) по записи, выбранной в таблице Customers (заказчики). В этом разделе мы разовьем проект и дадим возможность пользователю отметить в DataGrid конкретный заказ, после чего в дополнительной форме появятся подробности о выбранном заказе. Командой меню Проект\Добавить новую форму(Project/Add Windows Form) добавьте к проекту новую форму Установите для нее свойства FormBorderStyle=Fixed3D ; ShowInTaskbar=false ; MinimizeBox=false ; MaximizeBox=false , чтобы размеры формы нельзя было менять и при запуске она бы не отображалась в панели задач, а также убрали системные кнопки свертывания и развертывания окна Из палитры Панель элементов(Toolbox) перенесите на форму невизуальные пользовательские элементы, указанные в таблице, которые обеспечат только чтение данных из БД, и настройте их через мастера как ранее ( только для Select ) Мы будем связывать поставщики с тремя таблицами БД Northwind: Orders, Employees, Order Details и для них в значениях свойств объектов приведены уже готовые SQL-команды, которые попытайтесь получить с помощью мастера Построитель запросов(Query Builder). КОМПОНЕНТ СВОЙСТВО OleDbDataAdapter (Name) ЗНАЧЕНИЕ oleOrders CommandText SELECT OrderID, CustomerID, EmployeeID, OrderDate, RequiredDate, ShippedDate, ShipVia, Freight, ShipName, ShipAddress, ShipCity, ShipRegion, ShipPostalCode, ShipCountry FROM Orders WHERE (OrderID = ?) OleDbDataAdapter (Name) http://vitcs.ru oleEmployees Компьютерное образование для всех 6/10 Участник Элементы управления Базами данных. C#. ADO.NET 29.02.2016 CommandText SELECT EmployeeID, RTRIM(LastName) + ‘, ‘ + RTRIM(FirstName) AS FullName FROM Employees WHERE (EmployeeID = ?) OleDbDataAdapter (Name) oleOrderDetails CommandText SELECT OrderID, ProductID, UnitPrice, Quantity, Discount FROM [Order Details] WHERE (OrderID = ?) Для всех поставщиков создадим общий класс набора данных с именем DataSetAll и один экземпляр этого класса dataSetAll, где будут храниться все три таблицы БД одновременно. Вызовите контекстное меню для поставщика oleOrders, выполните команду Создать набор данных(Generate DataSet) и заполните окно мастера в соответствии с рисунком: рис 14 Переименуйте созданный объект набора данных в dataSetAll Вызовите контекстное меню для поставщика oleEmployees, выполните команду Создать набор данных(Generate DataSet) и заполните окно мастера в соответствии с рисунком: рис 15 Вызовите контекстное меню для поставщика oleOrderDetails, выполните команду Создать набор данных(Generate DataSet) и заполните окно мастера в соответствии с рисунком: http://vitcs.ru Компьютерное образование для всех 7/10 Участник Элементы управления Базами данных. C#. ADO.NET 29.02.2016 рис 16 Что мы сделали? Мы связали каждый поставщик с общим набором данных, где будут храниться три таблицы одновременно, а поставщики будут заполнять свои таблицы по команде из кода. Теперь нужно создать пользовательский интерфейс дополнительной формы. Добавьте на форму Form2 и настройте компоненты в соответствии с таблицей свойств, позиционируйте их в соответствии с рисунком: КОМПОНЕНТ СВОЙСТВО ЗНАЧЕНИЕ Label Text Номер заказа: TextBox BorderStyle FixedSingle (DataBindings).Text dataSetAll — Orders.OrderID Label Text Дата заказа: DateTimePicker (DataBindings).Value dataSetAll — Orders.OrderDate Format Long Label Text Принял заказ: TextBox BorderStyle FixedSingle (DataBindings).Text dataSetAll — Employees.FullName DataGrid http://vitcs.ru (Name) dgOrderDetails CaptionText Подробности заказов DataSource dataSetAll DataMember Order Details Компьютерное образование для всех 8/10 Участник Элементы управления Базами данных. C#. ADO.NET 29.02.2016 рис 15 В конструктор класса Form2 файла Form2.cs введите дополнительный параметр для передачи из Form1 номера выбранного заказа. рис 16 Для формы Form2 создайте обработчик события Load, который заполните так рис 17 Перейдите в режим Конструктор(View Designer) формы Form1, выделите объект dgOrders и через панель Свойства(Properties) создайте обработчик события Click, который заполните так рис 18 Вторичное окно мы показываем в модальном режиме, который перехватывает на себя цикл сообщений приложения, пока не будет закрыто модальное окно. http://vitcs.ru Компьютерное образование для всех 9/10 Участник Элементы управления Базами данных. C#. ADO.NET 29.02.2016 Испытайте работу приложения. рис 19 Самостоятельное задание. Используя материалы занятия, создайте несколько дополнительных связанных форм вашей базы данных. http://vitcs.ru Компьютерное образование для всех 10/10