Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 890 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 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. Весь код, введенный вручную на текущий момент
  • Постройте проект и удостоверьтесь в правильной работе добавленных возможностей. При проверке добавляйте строки, а затем удаляйте их, но не трогайте существующие записи, чтобы база соответствовала оригиналу для получения одинаковых со мной результатов.
  • При анализе кода в редакторе кода оболочки используйте его возможность, показанную на рисунке (очень удобно!)


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