При выполнении в лабораторной работе упражнения №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.