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

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

Отображение связанных подробностей на дополнительной форме

В предыдущем разделе мы просматривали отфильтрованные записи дочерней таблицы 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)
oleEmployees
  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 и заполните окно мастера в соответствии с рисунком


  • Переименуйте созданный объект набора данных в dataSetAll
  • Вызовите контекстное меню для поставщика oleEmployees, выполните команду Generate DataSet и заполните окно мастера в соответствии с рисунком


  • Вызовите контекстное меню для поставщика oleOrderDetails, выполните команду Generate DataSet и заполните окно мастера в соответствии с рисунком


Что мы сделали? Мы связали каждый поставщик с общим набором данных, где будут храниться три таблицы одновременно, а постащики будут заполнять свои таблицы по команде из кода. Теперь нужно создать пользовательский интерфейс дополнительной формы.

  • Добавьте на форму 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 (Name) dgOrderDetails
  CaptionText Подробности заказов
  DataSource dataSetAll
  DataMember Order Details


  • В конструктор класса Form2 файла Form2.cs введите дополнительный параметр для передачи из Form1 номера выбранного заказа
public partial class Form2 : Form
    {
        long orderID;// Поле для идентификатора заказа
        // Идентификатор заказа передается 
        // через конструктор вызывающей формы 
        public Form2(long orderID)
        {
            InitializeComponent();
            this.orderID = orderID;
        }
    }
  • Для формы Form2 создайте обработчик события Load, который заполните так
private void Form2_Load(object sender, EventArgs e)
        {
            // Найти одну запись по номеру orderID ключевого поля
            oleOrders.SelectCommand.Parameters[0].Value = orderID;
            oleOrders.Fill(dataSetAll, "Orders");
    
            // Найти закрепленного за заказом служащего 
            oleEmployees.SelectCommand.Parameters[0].Value = 
                dataSetAll.Orders[0].EmployeeID;
            oleEmployees.Fill(dataSetAll, "Employees");
    
            // Найти записи с деталями, соответствующие выбранному заказу
            oleOrderDetails.SelectCommand.Parameters[0].Value = orderID;
            oleOrderDetails.Fill(dataSetAll, "Order Details");
        }
  • Перейдите в режим View Designer формы Form1, выделите объект dgOrders и через панель Properties создайте обработчик события Click, который заполните так
private void dgOrders_Click(object sender, EventArgs e)
        {
            // В первом столбце находится OrderID
            long orderID = Convert.ToInt64(dataSet21.Orders.Rows
                [dgOrders.CurrentCell.RowNumber].ItemArray[0]);
            Form frm2 = new Form2(orderID);// Передаем параметр
            frm2.ShowDialog();
        }
  • Вторичное окно мы показываем в модальном режиме, который перехватывает на себя цикл сообщений приложения, пока не будет закрыто модальное окно
  • Испытайте работу приложения

Спроектированное приложение читает всех заказчиков в элемент ComboBox и заполняет элемент DataGrid всеми заказами для выбранного заказчика. Затем по выделенному заказу во вторую форму передается номер заказа и по нему заполняется подробностями заказа объект DataGrid и другие элементы представления данных. Данные, выбранные из разных таблиц, хранятся в одном наборе данных с именем dataSetAll.

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

При выполнении в лабораторной работе упражнения №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" или один из зависимых от них компонентов. Не удается найти указанный файл.

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