Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗАДАНИЕ НА 6 ФЕВРАЛЯ 2015 Г.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
654.36 Кб
Скачать

Упражнение 4. Поиск строки DataTable с помощью метода Find()

Объект DataTable - это находящееся в кэше памяти представление выбранных из БД данных в табличной форме. Он может быть заполнен объединением одной или нескольких таблиц из базы данных. Первоначальное заполнение DataTable выполняется адаптером в соответствии с SQL-запросом. Но после первоначальной загрузки некоторые столбцы могут быть добавлены в DataTable уже как результат вычислительных действий над исходными столбцами в отсоединенном режиме.

Можно по исходным таблицам создавать новые виртуальные таблицы, готовя их для отображения пользователю в соответствии с уровнем бизнес-логики приложения. Эти таблицы можно наделять свойствами физических таблиц, назначая им ключевые поля и устанавливая отношения между ними типа главная-дочерняя.

Есть два пути выборки нескольких строк или поиска конкретной строки таблицы: либо сформировать SQL-запрос к исходной таблице БД с заданным условием, либо загрузить исходную таблицу в кэш и уже в нем выполнять требуемую выборку. Объект DataTable имеет встроенные средства выборки нескольких строк из таблицы кэша с их сортировкой или поиска конкретной строки. В последнем случае применяется метод Find(), который работает только со столбцом, содержащим значения первичного ключа. Поэтому перед вызовом метода Find() нужно либо загрузить схему, либо вручную указать первичный ключ. Результатом выборки будет новая таблица, строка или массив строк.

В данном упражнении мы будем работать с таблицей Customers, схема которой показана на рисунке

SQL-командой мы полностью загрузим в кэш все столбцы таблицы Customers. В отсоединенном режиме по выбранному CustomerIDбудем искать соответствующую запись и показывать пользователю значения полей CustomerID, CompanyName, Adress, City,Region и Phone виртуальной таблицы. Столбцы CustomerID и CompanyName динамически свяжем с раскрывающимся спискомComboBox, причем столбец CompanyName сделаем видимым. Значения полей найденной записи будем отображать в элементахTextBox, недоступных для редактирования. Столбцу CustomerID присвоим статус первичного ключа виртуальной таблицы.

  • Добавьте к решению новый проект оконного приложения с именем WinForms4, назначьте его стартовым и создайте пользовательский интерфейс в соответствии с таблицей

Объект

Свойство

Значение

Пояснения

Form1

Text

Упражнение 4

Заголовок окна

 

MaximizeBox

False

Отключили системную кнопку

 

FormBorderStyle

FixedSingle

Размеры окна менять нельзя

Label

Text

Customer:

 

ComboBox

(Name)

cbCustomers

 

 

DropDownStyle

DropDownList

Текст в поле списка редактировать нельзя

Label

Text

Customer ID:

 

TextBox

(Name)

txtCustomerID

 

Label

Text

Company Name:

 

TextBox

(Name)

txtCompanyName

 

Label

Text

Address:

 

TextBox

(Name)

txtAddress

 

Label

Text

City:

 

TextBox

(Name)

txtCity

 

Label

Text

Region:

 

TextBox

(Name)

txtRegion

 

Label

Text

Phone:

 

TextBox

(Name)

txtPhone

 

txtCustomerID, txtCompanyName, txtAddress, txtCity,txtRegion, txtPhone

BorderStyle

FixedSingle

Простая рамка вокруг текстового поля

Форма на этапе проектирования должна выглядеть так

  • Защитите текстовые поля от редактирования, для этого: выделите на форме все элементы TextBox и в панели Properties в режиме Events создайте для них общий обработчик события KeyPress, затем общий обработчик события KeyDown. Обработчики заполните так

private void txtCustomerID_KeyPress(object sender, KeyPressEventArgs e)

{

e.Handled = true;

}

private void txtCustomerID_KeyDown(object sender, KeyEventArgs e)

{

e.Handled = true;

}

  • В панели Solution Explorer добавьте к корневому узлу проекта WinForms4 папку Data и перетащите в нее мышью из соседнего проекта файл Northwind.mdb (при этом отклоните предложение мастера конфигурации источника данных)

  • Добавьте в начало файла Form1.cs подключения пространства имен сборки System.Data.dll, нужные для обеспечения видимости библиотечных классов

// Дополнительные пространства имен

using System.Data.OleDb;

using System.Data.Common;

using System.Collections;

  • Добавьте в класс Form1 метод LoadCustomers(), который загружает таблицу Customers из БД с помощью динамически созданного поставщика данных и SQL-запроса

// Строка соединения с абсолютным путем к БД, определяемым сборкой

String ConnectionString(String fileName)

{

string JetEngineString = @"Provider=Microsoft.Jet.OLEDB.4.0;"

+ "Jet OLEDB:Engine Type=5;Data Source=";

string pathToFile = Application.StartupPath.ToString() + "\\Data\\";

return JetEngineString + pathToFile + fileName.Trim() + ".mdb";

}

DataTable tableCustomers;

void LoadCustomers()

{

OleDbCommand selectCommand = new OleDbCommand();

selectCommand.CommandText="SELECT * FROM Customers";

selectCommand.Connection = new OleDbConnection(ConnectionString("Northwind"));

selectCommand.CommandType = CommandType.Text;

OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand);

tableCustomers = new DataTable();// Создать таблицу

try

{

// Заполнить таблицу

adapter.Fill(tableCustomers);

// Указать первичный ключ из одного столбца для использования метода Find()

tableCustomers.PrimaryKey =

new DataColumn[] { tableCustomers.Columns["CustomerID"] };

}

catch (OleDbException exc)

{

tableCustomers = null;

MessageBox.Show(exc.Message, "Ошибка",

MessageBoxButtons.OK, MessageBoxIcon.Error);

}

finally

{

selectCommand.Connection.Close();

}

// Связываем ComboBox с виртуальной таблицей

cbCustomers.DataSource = tableCustomers;

cbCustomers.DisplayMember = "CompanyName";

cbCustomers.ValueMember = "CustomerID";

}

  • Вставьте вызов метода LoadCustomers() в конструктор класса Form1 проекта WinForms4

public Form1()

{

InitializeComponent();

LoadCustomers();

}

  • Выделите объект cbCustomers и создайте для его события SelectedIndexChanged обработчик. Этот же обработчик зарегистрируйте и для события BindingContextChanged объекта cbCustomers. Заполните обработчик следующим кодом

private void cbCustomers_SelectedIndexChanged(object sender, EventArgs e)

{

if (tableCustomers == null)

return; // При исключении выходить

// Найти запись

Object findValue = cbCustomers.SelectedValue;// Выделенное значение ValueMember

DataRow row = tableCustomers.Rows.Find(findValue);

// Заполнить текстовые поля

if (row != null)

{

txtCustomerID.Text = row["CustomerID"].ToString();

txtCompanyName.Text = row["CompanyName"].ToString();

txtAddress.Text = row["Address"].ToString();

txtCity.Text = row["City"].ToString();

txtRegion.Text = row["Region"].ToString();

txtPhone.Text = row["Phone"].ToString();

}

}

  • Запустите проект: список заполняется сразу при запуске проекта, текстовые поля отображают подробности при выборе заказчика и недоступны для редактирования, как и поле ComboBox

Поиск строки в виртуальной таблице DataTable выполняется методом Find() по столбцу CustomerID, назначенному нами первичным ключем. Без этого метод работать не будет. Критерий поиска берется из выбранного пользователем значения списка. Задача решена.