Элементы управления Data в приложениях на C#
Окончательное оформление формы, связанной с данными
В форме ввода данных должны быть предусмотрены не только основные средства обработки данных, но и учтены такие второстепенные нюансы, как возможность запретить или разрешить использование элементов управления с учетом тех операций, которые выполняются в настоящий момент с записью. Нужно своевременно включать или отключать важные кнопки, чтобы пользователь в критические дни чувствовал себя защищенным - без кариеса, угрей, дурного запаха, перхоти, жирных пятен, вредных бактерий и насекомых и т.д. и т.п.
На данном этапе наша форма обеспечивает выполнение основной части важнейших функций обработки данных. Но пользователи могут плохо ориентироваться в том, когда им разрешено выполнять определенные операции с кнопками.
В этом разделе мы реализуем следующие функции в нашем приложении:
- Разрешение или запрещение свойства Enabled кнопок btnSave, btnCancel, btnNew и btnDelete в соответствующих состояниях программы, когда нажатие на них может быть нежелательно.
- Добавление кнопки для закрытия формы.
- Ввод определенного кода в обработчик события 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. Код начальной загрузки списка данными
- Постройте приложение и проверьте заложенную в нем функциональность