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



