Опубликован: 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. Весь код, введенный вручную на текущий момент
  • Постройте проект и удостоверьтесь в правильной работе добавленных возможностей. При проверке добавляйте строки, а затем удаляйте их, но не трогайте существующие записи, чтобы база соответствовала оригиналу для получения одинаковых со мной результатов.
  • При анализе кода в редакторе кода оболочки используйте его возможность, показанную на рисунке (очень удобно!)


Приведенный код полность рабочий, снабжен подробными комментариями, поэтому попробуйте проанализировать его самостоятельно (при необходимости для удобства можете распечатать).

Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000