Просмотр данных средствами ADO.NET с привязкой на этапе выполнения
Поиск записей с помощью объекта DataRow
Объект DataTable позволяет применить в программе еще один объект DataRow, который дает возможность выполнить поиск конкретной строки в таблице данных. Это удобно, если в форме необходимо предоставить пользователям некоторый механизм поиска данных.
Для разнообразия в этом упражнении вместо элемента управления ListBox мы будем использовать элемент управления ComboBox. Различие между этими двумя элементами управления только в том, что в них применяются разные способы выборки элементов.
При выборке элемента в ComboBox активизируется событие SelectIndexChanged. В обработчике этого события можно узнать значение свойства SelectItem, чтобы определить значение свойства ValueMember выбранной пользователем строки. Затем это значение можно передать в качестве параметра методу Find() коллекции Rows объекта DataTable. После успешного поиска строки данных значения ее полей загружаются в текстовые поля для показа пользователю.
Таким образом, при загрузке формы выбирается имя заказчика из раскрывающегося списка и текстовые поля заполняются данными найденной строки.
- 
 Добавьте
      к приложению новую форму с именем Form3  точно
      так, как мы добавляли Form0. Добавьте
      к приложению новую форму с именем Form3  точно
      так, как мы добавляли Form0.
- 
 Введите
      в форму элементы управления в соответствии с таблицей Введите
      в форму элементы управления в соответствии с таблицей
- 
 Настройте
      интерфейс пользователя так, как показано на снимке Настройте
      интерфейс пользователя так, как показано на снимке
- 
 Объявите
      внутри класса (можно в начале, можно в конце) как его закрытые
      члены две ссылочных переменных, которые будут использованы
      в методах класса. Кроме того, нужно предусмотреть булеву
      переменную flag  для
      контроля над завершением загрузки данных из базы. При загрузке
      формы автоматически будет срабатывает обработчик выбора
      элемента ComboBox   и будет пытаться получить ссылку на данные,
      которые еще не загружены в источник данных. Булева переменная
      и будет контролировать это состояние. Объявите
      внутри класса (можно в начале, можно в конце) как его закрытые
      члены две ссылочных переменных, которые будут использованы
      в методах класса. Кроме того, нужно предусмотреть булеву
      переменную 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 Создайте
      для формы 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 Создайте
    обработчик выбора пользователем элемента в 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  заполните так Поместите
      в форму Form0  текстовую метку и кнопку. Текстовую метку
      в свойстве Text  заполните так
Выборка данных с использованием объекта DataRow
- 
 Подстройте
      параметр Font   и TextAlign   текстовой метки так, чтобы было
      красиво. Подстройте
      параметр Font   и TextAlign   текстовой метки так, чтобы было
      красиво.
- 
 Создайте
      в форме Form0  обработчик для новой кнопки и заполните его
      так Создайте
      в форме Form0  обработчик для новой кнопки и заполните его
      так
private void button3_Click(object sender, System.EventArgs e)
{
  Form3 frm = new Form3();
  frm.Show();
}
                            Листинг
                        8.10.
                    Обработчик для кнопки открытия формы Form3
- Постройте приложение и проверьте работоспособность формы Form3. Результат внешне должен выглядеть примерно так
 
                             


