Китай |
Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 5:
Элементы управления Data в приложениях на C#
Добавление и удаление записей с использованием связанных элементов управления
Не менее важной задачей, чем редактирование данных, является возможность добавления новых и удаления существующих записей в таблице. Нужно поместить на форму две новых кнопки New и Delete и ввести переменную области действия класса для контроля за тем, происходит добавление или редактирование записи. Если будет вводиться новая запись, то при обновлении данных в приложении необходимо перегрузить данные в списке в том случае, если значение поля CompanyName попадает в область данных, загруженных в список с учетом фильтра поля txtCustLimit.
- Создайте копию формы файла Form4cs, переименуйте ее в файл Form5.cs и отключите от проекта файл Form4.cs
- Просмотрите код файла Form5.cs и выполните замену слов Form4 на Form5 в поисковике оболочки.
- Постройте проект и убедитесь, что функциональность новой формы сохранилась.
- Под кнопкой btnEdit поместите две новых кнопки со значениями Name=btnNew; Text=&New; Name=btnDelete; Text=&Delete
- Выделите в подвале формы поставщик данных odaCustomerList и внизу панели Properties щелкните по ссылке Configure Data Adapter..., вызвав мастер для установки режима обновления данных закрепленной таблицы базы данных, как это мы делали ранее для поставщика данных odaCustomerIndividual.
- Создайте для новых кнопок обработчики и заполните их, используя окончательный для данного этапа код C#
......................................................... static void Main() { Application.Run(new Form5()); } //***************************************************************** // Переменная-член класса для контроля над тем, // происходит ли добавление или редактирование записи private bool mbAddNew; //***************************************************************** // Обработчик кнопки загрузки данных // в список ListBox с именем lstCustomers private void btnLoadList_Click(object sender, System.EventArgs e) { LoadList(); } //***************************************************************** // Загрузка данных в список ListBox с именем lstCustomers private void LoadList() { // Присвоить параметру адаптера данных значение, // введенное для ограничения объема списка odaCustomerList.SelectCommand.Parameters[0].Value = txtCustLimit.Text; // Удалить текущие данные в наборе данных dsCustomerList.Clear(); // Заполнить набор данных списком заказчиков odaCustomerList.Fill(dsCustomerList); // Заполнить отдельный набор данных для начальной записи RefreshIndividual(); } //***************************************************************** // Обновление отдельного набора данных private void RefreshIndividual() { // Очистить отдельный набор данных dsCustomerIndividual.Clear(); // Определить, выбран ли текущий элемент if(lstCustomers.SelectedIndex != -1) { // Присвоить параметру SQL адаптера данных отдельного // набора выбранный идентификатор заказчика // Заполнить набор данных try { odaCustomerIndividual.SelectCommand.Parameters[0].Value = lstCustomers.SelectedValue; odaCustomerIndividual.Fill(dsCustomerIndividual); } catch(Exception e1) { MessageBox.Show(e1.Message); } } } //***************************************************************** // Обработчик выбора элемента списка private void lstCustomers_SelectedIndexChanged(object sender, System.EventArgs e) { // Заполнить отдельный набор данных значениями // полей текущего элемента списка RefreshIndividual(); } //***************************************************************** // Обработчик события Click кнопки Edit private void btnEdit_Click(object sender, System.EventArgs e) { // Разрешить редактирование данных в кэше ActivateEditing(true); } //***************************************************************** // Функция изменения свойств текстовых полей private void ActivateEditing(bool bEnable) { // Только для чтения txtCustomerID.ReadOnly = txtCompanyName.ReadOnly = txtContactName.ReadOnly = txtContactTitle.ReadOnly = txtAddress.ReadOnly = txtCity.ReadOnly = txtRegion.ReadOnly = txtPostalCode.ReadOnly = txtCountry.ReadOnly = txtPhone.ReadOnly = txtFax.ReadOnly = !bEnable; // Стиль текстовых полей if(bEnable) { txtCustomerID.BorderStyle = txtCompanyName.BorderStyle = txtContactName.BorderStyle = txtContactTitle.BorderStyle = txtAddress.BorderStyle = txtCity.BorderStyle = txtRegion.BorderStyle = txtPostalCode.BorderStyle = txtCountry.BorderStyle = txtPhone.BorderStyle = txtFax.BorderStyle = BorderStyle.Fixed3D; } else { txtCustomerID.BorderStyle = txtCompanyName.BorderStyle = txtContactName.BorderStyle = txtContactTitle.BorderStyle = txtAddress.BorderStyle = txtCity.BorderStyle = txtRegion.BorderStyle = txtPostalCode.BorderStyle = txtCountry.BorderStyle = txtPhone.BorderStyle = txtFax.BorderStyle = BorderStyle.FixedSingle; } } //***************************************************************** // Обработчик события Click кнопки Save private void btnSave_Click(object sender, System.EventArgs e) { SaveRecord(); ActivateEditing(false); // Добавлен код для загруки новой записи if(mbAddNew) { // Загрузка данных новой записи LoadList(); // Наша функция // Обновление отдельного набора данных RefreshIndividual(); // Наша функция mbAddNew = false; } } //***************************************************************** // Сохранить изменения в базе данных private void SaveRecord() { // Применить класс BindingContext для завершения // текущего сеанса редактирования, чтобы иметь // возможность записать обновления в базу данных this.BindingContext[dsCustomerIndividual, "Customers"].EndCurrentEdit(); // Обновить данные в кэше из набора данных dsCustomerIndividual // в поставщик данных odaCustomerIndividual odaCustomerIndividual.Update(dsCustomerIndividual, "Customers"); // Передать данные из кэша поставщика данных в базу dsCustomerIndividual.AcceptChanges(); } //***************************************************************** // Обработчик события Click кнопки Cancel private void btnCancel_Click(object sender, System.EventArgs e) { // Для отмены текущей операции // применяется класс BindingContext this.BindingContext[dsCustomerIndividual, "Customers"].CancelCurrentEdit(); ActivateEditing(false); mbAddNew = false; } //***************************************************************** private void btnNew_Click(object sender, System.EventArgs e) { mbAddNew = true; // Добавить новую запись с использованием класса BindingContext this.BindingContext[dsCustomerIndividual, "Customers"].AddNew(); ActivateEditing(true); } //***************************************************************** private void btnDelete_Click(object sender, System.EventArgs e) { // Отменить строку для удаления с использованием // метода RemoveAt() класса BindingContext this.BindingContext[dsCustomerIndividual, "Customers"] .RemoveAt(BindingContext[dsCustomerIndividual, "Customers"].Position); // Обновить данные в кэше из набора данных dsCustomerIndividual // в поставщик данных odaCustomerIndividual odaCustomerIndividual.Update(dsCustomerIndividual, "Customers"); // Передать данные из кэша поставщика данных в базу dsCustomerIndividual.AcceptChanges(); // Перезагрузить список LoadList(); // Отобразить первую запись RefreshIndividual(); // Отключить текстовые поля ActivateEditing(false); }Листинг 5.9. Весь код, введенный вручную на текущий момент
- Постройте проект и удостоверьтесь в правильной работе добавленных возможностей. При проверке добавляйте строки, а затем удаляйте их, но не трогайте существующие записи, чтобы база соответствовала оригиналу для получения одинаковых со мной результатов.
- При анализе кода в редакторе кода оболочки используйте его возможность, показанную на рисунке (очень удобно!)
Приведенный код полность рабочий, снабжен подробными комментариями, поэтому попробуйте проанализировать его самостоятельно (при необходимости для удобства можете распечатать).