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