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

Элементы управления DataGrid и ComboBox в приложениях ADO.NET на C#

Аннотация: Связывание данных с элементами управления DataGrid и ComboBox. Повышение степени детализации представления данных в элементе управления DataGrid. Элементы интерфейса пользователя.

Связывание данных с элементами управления DataGrid и ComboBox

Файлы к лабораторной работе Вы можете скачать здесь.

Иногда для отображения перечня вариантов выбора может потребоваться элемент ComboBox поля с раскрывающимся списком, а не использованный нами ListBox. В приложении может также возникнуть необходимость представить информацию в виде таблицы с учетом элементов, выбранных в этом поле со списком.

Применительно к нашей учебной базе Northwind (см. каталог Data) предположим, что для отображения перечня заказчиков наше руководство с похмелья решило использовать вместо ListBox элемент управления ComboBox. Оно захотело, чтобы после выбора заказчика на экран выводилась информация о том, какие заказы были сделаны этим заказчиком.

План действий

Но нас на испуг не взять и на кривой козе не объехать, поскольку мы знаем, что для связывания элементов управления ComboBox и DataGrid с данными применяются такие же свойства объектов и способы организации программы, как и при использовании элемента управления ListBox. Вначале создаются поставщики данных DataAdapter и наборы данных DataSet, позволяющие определить значение свойства DataSource источника данных. Элемент управления DataAdapter для рассматриваемого элемента управления DataGrid будет включать в себя параметр, в котором применяется значение, выбранное в элементе управления ComboBox.

В качестве значения свойства DataSource этих элементов управления должен быть указан вновь созданный набор данных DataSet. Для успешного использования элемента управления DataGrid фактически достаточно присвоить значение только этому свойству. А при подготовке к работе элемента управления ComboBox следует также присвоить значения свойствам ValueMember и DisplayMember.

Затем необходимо ввести в приложение код для заполнения элемента управления DataSet, указанного в качестве значения свойства DataSource элемента управления ComboBox. И наконец, должна быть создана функция для передачи выбранного значения из ComboBox в поставщик данных DataAdapter, чтобы тот обеспечил заполнение DataGrid нужными данными. В результате, после выбора пользователем в ComboBox нужного заказчика на экране элемент DataGrid немедленно отобразит соответствующую выборку из базы. Вот и все - после этого можно опять идти курить бамбук.

Создание нового проекта

  • Создайте новый проект с именем WinADODataGrid


  • Из вкладки Data панели Toolbox поместите на форму двойным щелчком 2 элемента управления OleDbDataAdapter и 2 элемента управления DataSet. Настройте их в соответствии со значеними, приведенными ниже в таблице.

Наборы данных DataSet для поставщика данных DataAdapter можно создать двумя способами:

  1. помещать компоненты DataSet на форму из вкладки
  2. через контекстное меню поставщика DataAdapter выполнением команды Generate Dataset ( сделайте таким способом )

Примечание. Рекомендуется настраивать элементы управления OleDbDataAdapter не потом через панель свойств, а сразу при их создании в автоматически запускающемся мастере Data Adapter Configuration Wizard, как мы это делали в прошлой лабораторной работе. Этот мастер мы можем и сами всегда вызвать через контекстное меню или по ссылке из подвала панели Properties для выделенного элемента DataAdapter.


Для создания элемента управления DataSet щелкните правой кнопкой мыши на соответствующем элементе управления OleDbDataAdapter и из контекстного меню выполните команду Generate Dataset, или, то же самое, по одноименной ссылке в подвале панели Properties.

Кроме того, следует учитывать, что при создании набора данных оболочка всегда модифицирует заказанное имя источника данных добавлением в конце символа 1 и перевода первой буквы в верхний регистр. Если такие изменения, вносимые самовольно оболочкой, вас не устраивают, корректируйте их через панель свойств.

Элементы управления OleDbDataAdapter и DataSet
Объект Свойство Значение
OleDbDataAdapter Name odaCustomerList
  SelectCommand oleDbSelectCommand1
  CommandText SELECT CustomerID, CompanyName FROM Customers
DataSet Name dsCustomerList
  DataSetName dsCustomerList
OleDbDataAdapter Name odaOrdersForCustomer
  SelectCommand oleDbSelectCommand2
  CommandText SELECT OrderID, OrderDate, RequiredDate, ShippedDate FROM Orders WHERE (CustomerID = ?) ORDER BY OrderDate
DataSet Name dsOrdersForCustomer
  DataSetName dsOrdersForCustomer

Поля таблицы Orders, которые мы используем в SQL-запросах, можно посмотреть в панели Server Explorer оболочки


  • Проверьте, что после создания и настройки элементов управления данными подвал формы выглядит так


  • Поместите на форму (введите в проект) элементы управления ComboBox, DataGrid, Label из вкладки Windows Forms и настройте их свойства в соответствии с таблицей
Значения свойств Label, ComboBox и DataGrid
Объект Свойство Значение
Form Text Заказы клиентов
Label Text Выберите клиента:
  TextAlign MiddleRight
ComboBox Name cboCustomers
  DataSource dsCustomerList.Customers
  DisplayMember CompanyName
  ValueMember CustomerID
DataGrid Name dgOrders
  DataSource dsOrdersForCustomer.Orders
  Dock Bottom
  • В панели свойств выделите Form1, найдите событие Load, создайте для него обработчик и заполните его так
//***************************************************************
private void Form1_Load(object sender, System.EventArgs e)
{
  // Выбрать из поставщика информацию в набор данных,
  // содержимое которого сразу отображается в ComboBox
  odaCustomerList.Fill(this.dsCustomerList);
  
  // Если клиент выбран в ComboBox,
  // то загрузить его заказы в DataGrid
  RefreshOrders();
}
  
//***************************************************************
private void RefreshOrders()
{
  // Очистить набор данных, соответсвующий DataGrid
  this.dsOrdersForCustomer.Clear();
  
  // Определить, выбран ли клиент в ComboBox
  if(this.cboCustomers.SelectedIndex == -1) return; // Клиент не выбран
  
  // Передать поставщику значение ключа CustomerID,
  // для которого поставщик должен выбрать из базы
  // значения указанных в операторе SELECT полей
  this.odaOrdersForCustomer.SelectCommand.Parameters[0].Value
    = this.cboCustomers.SelectedValue;
  
  // Налить данные в dsOrdersForCustomer из поставщика
  this.odaOrdersForCustomer.Fill(dsOrdersForCustomer);
}
Листинг 6.1. Обработчик события Load формы
  • Выделите в панели свойств элемент ComboBox с именем cboCustomers и создайте для его события SelectIndexChanged обработчик


  • Обработчик заполните так
//***************************************************************
private void cboCustomers_SelectedIndexChanged(object sender, System.EventArgs e)
{
  RefreshOrders();
}
Листинг 6.2. Обработчик события SelectIndexChanged
  • Постройте приложение и убедитесь в его работоспособности. Внешне оно должно выглядеть так