Просмотр данных средствами ADO.NET с привязкой на этапе выполнения
Поиск записей с помощью объекта DataRow
Объект DataTable позволяет применить в программе еще один объект DataRow, который дает возможность выполнить поиск конкретной строки в таблице данных. Это удобно, если в форме необходимо предоставить пользователям некоторый механизм поиска данных.
Для разнообразия в этом упражнении вместо элемента управления ListBox мы будем использовать элемент управления ComboBox. Различие между этими двумя элементами управления только в том, что в них применяются разные способы выборки элементов.
При выборке элемента в ComboBox активизируется событие SelectIndexChanged. В обработчике этого события можно узнать значение свойства SelectItem, чтобы определить значение свойства ValueMember выбранной пользователем строки. Затем это значение можно передать в качестве параметра методу Find() коллекции Rows объекта DataTable. После успешного поиска строки данных значения ее полей загружаются в текстовые поля для показа пользователю.
Таким образом, при загрузке формы выбирается имя заказчика из раскрывающегося списка и текстовые поля заполняются данными найденной строки.
- Добавьте к приложению новую форму с именем Form3 точно так, как мы добавляли Form0.
- Введите в форму элементы управления в соответствии с таблицей
- Настройте интерфейс пользователя так, как показано на снимке
- Объявите внутри класса (можно в начале, можно в конце) как его закрытые члены две ссылочных переменных, которые будут использованы в методах класса. Кроме того, нужно предусмотреть булеву переменную flag для контроля над завершением загрузки данных из базы. При загрузке формы автоматически будет срабатывает обработчик выбора элемента ComboBox и будет пытаться получить ссылку на данные, которые еще не загружены в источник данных. Булева переменная и будет контролировать это состояние.
// Windows Form Designer generated code // Объявляем ссылочные переменные-члены // класса Form3 для доступа из методов private System.Data.OleDb.OleDbDataAdapter adapter; private System.Data.DataTable table; bool flag = false;// Признак, что данные загруженыЛистинг 8.7. Объявление ссылочных переменных-членов класса Form3
- Создайте для формы Form3 обработчик события Load
- Заполните обработчик следующим кодом
private void Form3_Load(object sender, System.EventArgs e) { // Сброс надписей в боксах cboCustomers.Text = txtCustomerID.Text = txtCompanyName.Text = txtAddress.Text = txtCity.Text = ""; // Выполнение в защищенном режиме с перехватом исключений try { // Создать объект таблицы данных table = new System.Data.DataTable(); // Создать адаптер данных adapter = new System.Data.OleDb.OleDbDataAdapter( "SELECT * FROM Customers", Form1.BuildCnnStr("localhost", "Northwind")); // Заполнить таблицу данных из адаптера данных adapter.Fill(table); // Создать столбец для хранения первичного ключа System.Data.DataColumn[] column = new System.Data.DataColumn[1]; // Задать первичный ключ для таблицы данных column[0] = table.Columns["CustomerID"]; table.PrimaryKey = column; // Связать ComboBox с данными cboCustomers.DataSource = table; cboCustomers.DisplayMember = "CompanyName"; cboCustomers.ValueMember = "CustomerID"; flag = true; // Данные загружены!!! } catch(System.Data.OleDb.OleDbException oextData) { // Обработать возникшее исключение MessageBox.Show(oextData.Message); } }Листинг 8.8. Код выборки данных при загрузке формы
- Создайте обработчик выбора пользователем элемента в ComboBox
- Заполните обработчик следующим кодом
private void cboCustomers_SelectedIndexChanged(object sender, System.EventArgs e) { if(!flag) return;// Данные еще не готовы!!! System.Data.DataRow row; // Объявлена ссылка на строку поиска System.Object[] aFindValue = new Object[1];// Место под передаваемый объект // Передать искомый элемент и воспользоваться методом поиска aFindValue[0] = cboCustomers.SelectedValue; row = table.Rows.Find(aFindValue); // Заполнить текстовые поля формы из найденной строки таблицы txtCustomerID.Text = row["CustomerID"].ToString(); txtCompanyName.Text = row["CompanyName"].ToString(); txtAddress.Text = row["Address"].ToString(); txtCity.Text = row["City"].ToString(); }Листинг 8.9. Обработчик выбора пользователя в ComboBox
- Поместите в форму Form0 текстовую метку и кнопку. Текстовую метку в свойстве Text заполните так
Выборка данных с использованием объекта DataRow
- Подстройте параметр Font и TextAlign текстовой метки так, чтобы было красиво.
- Создайте в форме Form0 обработчик для новой кнопки и заполните его так
private void button3_Click(object sender, System.EventArgs e) { Form3 frm = new Form3(); frm.Show(); }Листинг 8.10. Обработчик для кнопки открытия формы Form3
- Постройте приложение и проверьте работоспособность формы Form3. Результат внешне должен выглядеть примерно так