Опубликован: 05.08.2010 | Доступ: свободный | Студентов: 2010 / 47 | Оценка: 4.50 / 4.40 | Длительность: 60:26:00
Самостоятельная работа 4:

Разработка приложений ADO.NET для OLE DB

Упражнение 2. Связывание данных с элементами управления 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, а прежний проект FormsADO исключите из решения командой Remove

  • Поместите в рабочую область оболочки компонент OleDbDataAdapter, соедините его с файлом Northwind.mdb БД из прилагаемого каталога Source (на предложение оболочки скопировать файл БД в проект ответьте Да ) и настройте его только на чтение полей CustomerID и CompanyName таблицы Customers (заказчики), используя построитель Query Builder, как это мы делали ранее в предыдущем упражнении



  • Выделите поставщик oleDbDataAdapter1 и командой меню Data/Generate Dataset создайте для него класс DataSet1 и объект набора данных с автоматически сгенерированным именем dataSet11


  • Поместите на форму новый поставщик OleDbDataAdapter с именем oleDbDataAdapter2 для таблицы Orders (заказы), в его настройках учтите все возможности взаимодействия с данными, а в команде SELECT предусмотрите передачу значения параметра по полю CustomerID и сортировку по дате выбранных из БД данных. Для правильного формирования команды используйте окно Query Builder


Обратите внимание, как в каком порядке мы вызуально формируем в мастере Query Builder условие выборки по параметру CustomerID: вначале отмечаем поле CustomerID в верхней вкладке Orders окна мастера, чтобы это поле появилось во второй вкладке, далее прописываем фильтр =?, а затем в этой же второй вкладке снимаем флажок Output со столбца CustomerID, чтобы не включать его данные поставщиком.



  • Выделите поставщик oleDbDataAdapter2 и командой меню Data/Generate Dataset создайте для него класс DataSet2 и объект набора данных с автоматически сгенерированным именем dataSet21


  • Поместите на форму компоненты Label, ComboBox и DataGrid (если их нет в палитре Toolbox, добавьте к соответствующей вкладке командой контекстного меню Choose Items ), разместите их в соответствии с рисунком и настройте согласно приведенной таблице свойств


Компонент Свойство Значение
Label Text Заказчики
ComboBox (Name) cbCustomers
  DataSource dataSet11
  DisplayMember Customers.CompanyName
  ValueMember Customers.CustomerID
DataGrid (Name) dgOrders
  DataSource dataSet21
  DataMember Orders
  CaptionText Заказы для выбранного заказчика
  • Создайте для формы Form1 обработчик события Load, а для ComboBox - обработчик события SelectedIndexChanged, которые заполните так
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
    
namespace FormsADO2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            // Заполнить dataSet11 и связанный с ним ComboBox 
            // данными таблицы Customers - Заказчики
            oleDbDataAdapter1.Fill(dataSet11);

            // Заполнить dataSet21 и связанный с ним DataGrid данными
            // таблицы Orders - Заказы для выбранного Заказчика
            RefreshOrders();
        }
    
        private void RefreshOrders()
        {
            // Заполнить dataSet21 и связанный с ним DataGrid данными
            // таблицы Orders - Заказы для выбранного Заказчика
            dataSet21.Clear();
            // Если выбран Заказчик в ComboBox
            if (cbCustomers.SelectedIndex != -1)
            {
                oleDbDataAdapter2.SelectCommand.Parameters[0].Value =
                    cbCustomers.SelectedValue;
                oleDbDataAdapter2.Fill(dataSet21);
            }
        }
    
        private void cbCustomers_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Заполнить dataSet21 и связанный с ним DataGrid данными
            // таблицы Orders - Заказы для выбранного Заказчика
            RefreshOrders();
        }
    }
}
  • Запустите проект FormsADO2 и испытайте работу приложения


Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Xna.Framework.Graphics;

   

namespace Application1

{

    public partial class MainForm : Form

    {

        // Объявим поле графического устройства для видимости в методах

        GraphicsDevice device;

   

        public MainForm()

        {

            InitializeComponent();

   

            // Подпишемся на событие Load формы

            this.Load += new EventHandler(MainForm_Load);

   

            // Попишемся на событие FormClosed формы

            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);

        }

   

        void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {

            //  Удаляем (освобождаем) устройство

            device.Dispose();

            // На всякий случай присваиваем ссылке на устройство значение null

            device = null;       

        }

   

        void MainForm_Load(object sender, EventArgs e)

        {

            // Создаем объект представления для настройки графического устройства

            PresentationParameters presentParams = new PresentationParameters();

            // Настраиваем объект представления через его свойства

            presentParams.IsFullScreen = false; // Включаем оконный режим

            presentParams.BackBufferCount = 1;  // Включаем задний буфер

                                                // для двойной буферизации

            // Переключение переднего и заднего буферов

            // должно осуществляться с максимальной эффективностью

            presentParams.SwapEffect = SwapEffect.Discard;

            // Устанавливаем размеры заднего буфера по клиентской области окна формы

            presentParams.BackBufferWidth = this.ClientSize.Width;

            presentParams.BackBufferHeight = this.ClientSize.Height;

   

            // Создадим графическое устройство с заданными настройками

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware,

                this.Handle, presentParams);

        }

   

        protected override void OnPaint(PaintEventArgs e)

        {

            device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

   

            base.OnPaint(e);

        }

    }

}

Выбрасывается исключение:

Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл.

Делаю все пунктуально. В чем может быть проблема?