Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 889 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 8:

Просмотр данных средствами ADO.NET с привязкой на этапе выполнения

Поиск записей с помощью объекта DataRow

Объект DataTable позволяет применить в программе еще один объект DataRow, который дает возможность выполнить поиск конкретной строки в таблице данных. Это удобно, если в форме необходимо предоставить пользователям некоторый механизм поиска данных.

Для разнообразия в этом упражнении вместо элемента управления ListBox мы будем использовать элемент управления ComboBox. Различие между этими двумя элементами управления только в том, что в них применяются разные способы выборки элементов.

При выборке элемента в ComboBox активизируется событие SelectIndexChanged. В обработчике этого события можно узнать значение свойства SelectItem, чтобы определить значение свойства ValueMember выбранной пользователем строки. Затем это значение можно передать в качестве параметра методу Find() коллекции Rows объекта DataTable. После успешного поиска строки данных значения ее полей загружаются в текстовые поля для показа пользователю.

Таким образом, при загрузке формы выбирается имя заказчика из раскрывающегося списка и текстовые поля заполняются данными найденной строки.

  • Добавьте к приложению новую форму с именем Form3 точно так, как мы добавляли Form0.
  • Введите в форму элементы управления в соответствии с таблицей
Элементы управления Form3 и их свойства
Объект Свойство Значение
Label Text Customer:
  TextAlign MiddleRight
ComboBox Name cboCustomers
Label Text Customer ID:
  TextAlign MiddleRight
TextBox Name txtCustomerID
  BorderStyle FixedSingle
  ReadOnly True
Label Text Company Name:
  TextAlign MiddleRight
TextBox Name txtCompanyName
  BorderStyle FixedSingle
  ReadOnly True
Label Text Address:
  TextAlign MiddleRight
TextBox Name txtAddress
  BorderStyle FixedSingle
  ReadOnly True
Label Text City:
  TextAlign MiddleRight
TextBox Name txtCity
  BorderStyle FixedSingle
  ReadOnly True
  • Настройте интерфейс пользователя так, как показано на снимке


  • Объявите внутри класса (можно в начале, можно в конце) как его закрытые члены две ссылочных переменных, которые будут использованы в методах класса. Кроме того, нужно предусмотреть булеву переменную 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. Результат внешне должен выглядеть примерно так