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

Редактирование данных в среде ADO.NET

Добавление и удаление строк в наборе данных средствами среды ADO.NET

Здесь мы опять будем работать без использования элементов управления вкладки Data, а только с классами, соединяясь с элементами управления только на этапе выполнения. И будем реализовывать возможности классов для поддержки задачи редактирования данных.

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

  • В панели Solution Explorer проекта щелкните правой кнопкой мыши на узле Form1.cs и выполните команду Copy контекстного меню


  • Щелкните правой кнопкой мыши на узле самого проекта в дереве панели Solution Explorer и выполните команду Paste


  • Переименуйте созданную копию формы Form1 в файл Form2.cs


  • Щелкните правой кнопкой мыши на новом узле Form2.cs и выполните команду меню View Cide
  • В редакторе кода файла Form2.cs вызовите комбинацией клавиш Ctrl-F окно поиска и замены и выполните в коде замену всех вхождений Form1 на Form2
  • Откройте файл Form0.cs в режиме кода и раскомментируйте заблокированный нами ранее код открытия формы Form2 в обработчике второй кнопки
private void button2_Click(object sender, System.EventArgs e)
{
  Form2 frm = new Form2();
  frm.Show();
}
Листинг 9.10. Разблокирование кода в обработчике кнопки формы Form0
  • Запустите приложение, откройте форму Form2 и убедитесь, что она работоспособна и ее функциональность соответствует форме Form1 (эта ее копия и мы пока еще ничего в ней не резали и не клеили - ни селедку, ни Большого Билла).

Приступим к наращиванию кода в Form2 для добавления возможностей редактирования

  • Введите в класс Form2 объявление булевой переменной mblnAdd с начальной инициализацией false. Эта переменная будет играть роль флага для включения и отключения режима добавления новой записи в базу данных.
..........................................    
// Windows Form Designer generated code    
  
// Переменные-члены класса Form2
System.Data.DataSet mdsCustIndiv = 
  new System.Data.DataSet();// Объявили и создали набор данных
System.Data.OleDb.OleDbDataAdapter modaCustIndiv;// Только объявили поставщика
System.Data.DataRow mdrCustIndiv;// Ссылочная переменная
bool mblnAdd = false;// Флаг режима добавления записи
..........................................
Листинг 9.11. Объявление флага редактирования
  • Поместите в форму две новых кнопки для добавления и удаления записей со следующими значениями свойств
Свойства кнопок добавления и удаления записей
Объект Свойство Значение
Button Name btnAdd
  Text Add
Button Name btnDelete
  Text Delete

Кнопка Add будет включать режим добавления новой записи, которая будет добавлена в базу данных по нажатию кнопки Save.

  • В режиме Design выполните команду Format/Lock Controls так, чтобы сначала разомкнуть все элементы формы, а затем вновь замкнуть, дабы подсадить в эту компанию и новые кнопки.
  • В режиме Design добавьте в форму Form2 обработчик события Load


  • Наполните код обработчика так
private void Form2_Load(object sender, System.EventArgs e)
{
  AccessButtons(false); // Закрыть кнопки управления
}
  
//*****************************************************************
// Наша функция!!!
// Регулирует доступность кнопок
// в соответствующие поля набора данных через ссылку на строку
private void AccessButtons(bool bEnable)
{
  // Разрешить или запретить применение соответствующих кнопок
  btnEdit.Enabled = bEnable;
  btnAdd.Enabled = bEnable;
  btnDelete.Enabled = bEnable;
  btnCancel.Enabled = bEnable;
  btnSave.Enabled = bEnable;
}
Листинг 9.12. Обработчик события Load формы Form2, блокирующий кнопки

Этот обработчик нужен для отключения функциональности кнопок, пока данные еще не загружены.

  • Создайте обработчик события Click для кнопки Add. В этом обработчике прежде всего нужно поднять флаг режима добавления новой записи в базу данных. Затем необходимо очистить текстовые поля и снять с них режим ReadOnly. Код обработчика приведен ниже
//*****************************************************************
//*****************************************************************
// Дополнение класса возможностями редактирования данных
//*****************************************************************
//*****************************************************************
  
// Обработчик кнопки Add
private void btnAdd_Click(object sender, System.EventArgs e)
{
  mblnAdd = true; // Включен режим добавления записи
  ClearEditing();
  ActivateEditing(true);
}
  
//*****************************************************************
// Функция очистки текстовых полей
private void ClearEditing()
{
  txtCustomerID.Text = 
  txtCompanyName.Text = 
  txtContactName.Text = 
  txtContactTitle.Text = 
  txtAddress.Text = 
  txtCity.Text = 
  txtRegion.Text = 
  txtPostalCode.Text = 
  txtCountry.Text = 
  txtPhone.Text = 
  txtFax.Text = "";    
}
  
//*****************************************************************
// Функция изменения свойств текстовых полей
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;
  }
  
  // Разрешить или запретить применение соответствующих кнопок
  btnEdit.Enabled = !bEnable;
  btnDelete.Enabled = !bEnable;
  btnCancel.Enabled = bEnable;
  btnSave.Enabled = bEnable;
  
  // Установить фокус ввода на первое текстовое поле CustomerID
  if(bEnable)
    txtCustomerID.Focus();
}
Листинг 9.13. Код обработчика кнопки Add

Теперь нужно добавить обработчик события Click кнопки Save. В коде обработчика нужно проверить флаг режима добавления и принять решение, обновлять ли базу с добавлением новой записи или просто заменить значения текущих данных, считая, что проводилось просто редактирование.

  • Создайте обработчик события Click кнопки Save, которая у нас на форме присутствует, и заполните его следующим кодом
//*****************************************************************
// Обработчик кнопки Save
private void btnSave_Click(object sender, System.EventArgs e)
{
  ActivateEditing(false);
  SaveRecord();
  mblnAdd = false;
}
  
//*****************************************************************
// Сохранить изменения в базе данных
private void SaveRecord()
{
  if(mblnAdd)
  {
    // Создать новую строку в наборе данных
    // и сохранить ссылку на нее в ссылочной переменной
    mdrCustIndiv = mdsCustIndiv.Tables["Customers"].NewRow();
  }
  
  // Перекачать значения текстовых полей в строку набора данных
  mdrCustIndiv.BeginEdit();  // Открыть разрешение
  TextBoxToDataSet();      // Перекачать - наша функция!!!
  mdrCustIndiv.EndEdit();    // Закрыть разрешение
  
  // Использовать защищенный режим
  try
  {
    // Если режим добавления, то расширить набор 
    // данных, включив туда сформированную строку
    if(mblnAdd)
      mdsCustIndiv.Tables["Customers"].Rows.Add(mdrCustIndiv);
  
    // Создать экземпляр построителя SQL-команды
    System.Data.OleDb.OleDbCommandBuilder ocbCustIndiv = 
      new System.Data.OleDb.OleDbCommandBuilder(modaCustIndiv);
  
    // Настроить поставщик данных на действия
    // с помощью экземпляра построителя команды
    if(mblnAdd)
    {
      // Обеспечить вставку новой записи
      modaCustIndiv.InsertCommand = ocbCustIndiv.GetInsertCommand();
    }
    else
    {
      // Обеспечить обновление изменений существующей записи
      modaCustIndiv.UpdateCommand = ocbCustIndiv.GetUpdateCommand();
    }
  
    // Выполнить автоматически сгенерированную команду SQL
    modaCustIndiv.Update(mdsCustIndiv, "Customers");
    mdsCustIndiv.Tables["Customers"].AcceptChanges();
  
    // Отключиться от базы данных
    if(mblnAdd)
    {
      modaCustIndiv.InsertCommand.Connection.Close();
      LoadList();
    }
    else
      modaCustIndiv.UpdateCommand.Connection.Close();
  }
  catch(System.Data.OleDb.OleDbException excData)
  {
    System.Windows.Forms.MessageBox.Show(
      "Произошла ошибка: " + excData.Message);
  }
}
  
//*****************************************************************
// Наша функция!!!
// перекачивает текстовые поля элементов TextBox 
// в соответствующие поля набора данных через ссылку на строку
private void TextBoxToDataSet()
{
  mdrCustIndiv["CustomerID"] = txtCustomerID.Text;
  mdrCustIndiv["CompanyName"] = txtCompanyName.Text;
  mdrCustIndiv["ContactName"] = txtContactName.Text;
  mdrCustIndiv["ContactTitle"] = txtContactTitle.Text;
  mdrCustIndiv["Address"] = txtAddress.Text;
  mdrCustIndiv["City"] = txtCity.Text;
  mdrCustIndiv["Region"] = txtRegion.Text;
  mdrCustIndiv["PostalCode"] = txtPostalCode.Text;
  mdrCustIndiv["Country"] = txtCountry.Text;
  mdrCustIndiv["Phone"] = txtPhone.Text;
  mdrCustIndiv["Fax"] = txtFax.Text;
}
Листинг 9.14. Код, связанный с обработчиком кнопки Save
  • Создайте обработчик события Click кнопки Cancel, которая у нас на форме присутствует, и заполните его следующим кодом
//*****************************************************************
private void btnCancel_Click(object sender, System.EventArgs e)
{
  mblnAdd = false;  // Сбросить флаг режима добавления
  LoadIndividual();  // Повторить заполнение TextBox
  ActivateEditing(false);  // Перевести поля в режим "Только для чтения"
}
Листинг 9.15. Обработчик события Click кнопки Cancel
  • Создайте обработчик события Click кнопки Delete и наполните его так
//*****************************************************************
private void btnDelete_Click(object sender, System.EventArgs e)
{
  // Использовать защищенный режим
  try
  {
    // Удалить запись из объекта строки данных
    mdrCustIndiv.Delete();
  
    // Создать экземпляр построителя SQL-команды
    System.Data.OleDb.OleDbCommandBuilder ocbCustIndiv = 
      new System.Data.OleDb.OleDbCommandBuilder(modaCustIndiv);
  
    // Настроить поставщик данных на автоматическое удаление
    modaCustIndiv.DeleteCommand = ocbCustIndiv.GetDeleteCommand();
  
    // Выполнить автоматически сгенерированную команду SQL
    modaCustIndiv.Update(mdsCustIndiv, "Customers");
    mdsCustIndiv.Tables["Customers"].AcceptChanges();
  
    // Отключиться от базы данных
    modaCustIndiv.DeleteCommand.Connection.Close();
  }
  catch(System.Data.OleDb.OleDbException excData)
  {
    System.Windows.Forms.MessageBox.Show(
      "Произошла ошибка: " + excData.Message);
  }
  
  // Обновить экран свежими данными
  LoadList();
  
  // Установить режим текстовых полей "Только для чтения"
  ActivateEditing(false);
}
Листинг 9.16. Обработчик события Click кнопки Delete
  • Создайте обработчик события Click кнопки Edit и наполните его так
//*****************************************************************
// Обработчик события Click кнопки Edit
private void btnEdit_Click(object sender, System.EventArgs e)
{
  // Разрешить редактирование данных в кэше
  ActivateEditing(true);
}
Листинг 9.17. Обработчик события Click кнопки Edit
  • Постройте приложение и проверьте его работоспособность. Помните, что максимальный размер поля CustomerID равен 5. Это поле ключевое, поэтому его заполнение обязательно. Несоблюдение этих условий при испытании формы приведет к генерации ошибки базой данных.

Внешний вид формы Form2 будет примерно таким