Украина, Киев |
Элементы управления DataGrid и ComboBox в приложениях ADO.NET на C#
Связывание данных с элементами управления 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 можно создать двумя способами:
- помещать компоненты DataSet на форму из вкладки
- через контекстное меню поставщика DataAdapter выполнением команды Generate Dataset ( сделайте таким способом )
Примечание. Рекомендуется настраивать элементы управления OleDbDataAdapter не потом через панель свойств, а сразу при их создании в автоматически запускающемся мастере Data Adapter Configuration Wizard, как мы это делали в прошлой лабораторной работе. Этот мастер мы можем и сами всегда вызвать через контекстное меню или по ссылке из подвала панели Properties для выделенного элемента DataAdapter.
Для создания элемента управления DataSet щелкните правой кнопкой мыши на соответствующем элементе управления OleDbDataAdapter и из контекстного меню выполните команду Generate Dataset, или, то же самое, по одноименной ссылке в подвале панели Properties.
Кроме того, следует учитывать, что при создании набора данных оболочка всегда модифицирует заказанное имя источника данных добавлением в конце символа 1 и перевода первой буквы в верхний регистр. Если такие изменения, вносимые самовольно оболочкой, вас не устраивают, корректируйте их через панель свойств.
Поля таблицы Orders, которые мы используем в SQL-запросах, можно посмотреть в панели Server Explorer оболочки
- Поместите на форму (введите в проект) элементы управления ComboBox, DataGrid, Label из вкладки Windows Forms и настройте их свойства в соответствии с таблицей
- В панели свойств выделите 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
- Постройте приложение и убедитесь в его работоспособности. Внешне оно должно выглядеть так