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

Элементы управления Data в приложениях на C#

Окончательное оформление формы, связанной с данными

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

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

В этом разделе мы реализуем следующие функции в нашем приложении:

  1. Разрешение или запрещение свойства Enabled кнопок btnSave, btnCancel, btnNew и btnDelete в соответствующих состояниях программы, когда нажатие на них может быть нежелательно.
  2. Добавление кнопки для закрытия формы.
  3. Ввод определенного кода в обработчик события Closing формы, который перед завершение программы позволяет проверить, внесены ли изменения в текущую запись, и нужно ли их в таком случае сохранить.

Начнем с того, что откорректируем две ранее созданные нами функции RefreshIndividual() и ActivateEditing(). Затем обеспечим проверку того, была ли выбрана запись в списке заказчиков lstCustomers. В случае отрицательного ответа должно быть запрещено применение двух кнопок, btnEdit и btnDelete. Если же запись в списке заказчиков выбрана, то эти две кнопки должны быть разрешены и обновлено содержимое текстовых полей набором данных dsCustomerIndividual.

  • Разместите в конце тела функций RefreshIndividual() и ActivateEditing() код управления доступностью кнопок, как приведено ниже
//*****************************************************************
// Обновление отдельного набора данных
private void RefreshIndividual()
{
......................................................
  // Изменить свойство доступности кнопок
  if(lstCustomers.SelectedIndex == -1)
  {
    btnEdit.Enabled = false;
    btnDelete.Enabled = false;
  }
  else
  {
    btnEdit.Enabled = true;
    btnDelete.Enabled = true;
  }
}
  
//*****************************************************************
// Функция изменения свойств текстовых полей
private void ActivateEditing(bool bEnable)
{
......................................................
  // Разрешить или запретить применение соответствующих кнопок
  btnEdit.Enabled = !bEnable;
  btnNew.Enabled = !bEnable;
  btnDelete.Enabled = !bEnable;
      
  btnCancel.Enabled = bEnable;
  btnSave.Enabled = bEnable;
      
  // Установить фокус ввода на первое текстовое поле CustomerID
  if(bEnable)
    txtCustomerID.Focus();
}
Листинг 5.11. Код управления доступностью кнопок
  • Разместите внизу формы кнопку завершения работы приложения и назначьте ей свойства Name=btnClose; Text=C&lose
  • Создайте обработчик для кнопки btnClose и заполните его кодом так
//*****************************************************************
private void btnClose_Click(object sender, System.EventArgs e)
{
  this.Close();
}
Листинг 5.12. Обработчик кнопки Close

Теперь пришла пора создать обработчик события Closing формы. В нем нужно проверить состояние кнопки btnSave в момент закрытия приложения. Если она доступна, значит существуют несохраненные изменения данных. В этом случае нужно спросить у пользователя, желает ли он сохранить внесенные изменения.

  • Перейдите в режим Design, откройте панель Properties и в раскрывающемся списке установите текущим элемент формы Form5. Затем в режиме Events панели Properties найдите событие Closing и двойным щелчком на поле значений создайте для него обработчик


  • Заполните обработчик следующим кодом
//*****************************************************************
private void Form5_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
  if(!btnSave.Enabled) return; // Ничего не надо - все сохранено!
  
  string caption = "Сохранение результатов редактирования";
  string message = "Хотели бы Вы сохранить текущие изменения?";
  MessageBoxButtons buttons = MessageBoxButtons.05_57No;
  DialogResult result;
  
  // Вывести пользователю предупреждение.
  result = MessageBox.Show(this, message, caption, buttons);
  
  // Проанализировать выбор пользователя
  if(result == DialogResult.No) return; // Не желает сохранять
  
  // Пытаемся сохранить
  try
  {
    SaveRecord();
  }
  catch(Exception saveException)
  {
    caption = "Ошибка записи данных";
    message = "Произошла следующая ошибка:\n"
      + saveException.Message
      + "\nПродолжить закрытие формы?";
  
    // Вывести пользователю предупреждение.
    result = MessageBox.Show(this, message, caption, buttons);
  
    // Проанализировать выбор пользователя
    if(result == DialogResult.No)
      e.Cancel = true; // Прекратить закрытие формы
               // e - аргумент этого обработчика
  }
}
Листинг 5.13. Обработчик события закрытия формы
  • Добавьте в конструктор формы Form5() вызов нашей функции начальной загрузки списка данными
public Form5()
{
  //
  // Required for Windows Form Designer support
  //
  InitializeComponent();
  
  //
  // TODO: Add any constructor code after InitializeComponent call
  //
  LoadList();
}
Листинг 5.14. Код начальной загрузки списка данными
  • Постройте приложение и проверьте заложенную в нем функциональность