У меня есть диалоговое окно, с которым я показываю <class>.ShowDialog()
. Это имеет кнопку OK и Кнопку отмены; кнопка OK также имеет обработчик событий.
Я хочу сделать некоторый контроль ввода в конечном счете обработчик и, если он перестал работать, уведомьте пользователя с окном сообщения и препятствуйте тому, чтобы диалоговое окно закрылось. Я не знаю, как сделать последнюю часть (предотвращение завершения).
Учитывая, что вы указали, что хотите отображать всплывающее диалоговое окно с ошибкой , один из способов сделать это - переместить вашу проверку в OnClosing
обработчик событий. В этом примере закрытие формы прерывается, если пользователь отвечает на вопрос в диалоговом окне утвердительно.
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// Determine if text has changed in the textbox by comparing to original text.
if (textBox1.Text != strMyOriginalText)
{
// Display a MsgBox asking the user to save changes or abort.
if(MessageBox.Show("Do you want to save changes to your text?", "My Application",
MessageBoxButtons.YesNo) == DialogResult.Yes)
{
// Cancel the Closing event from closing the form.
e.Cancel = true;
// Call method to save file...
}
}
}
Установив e.Cancel = true
, вы предотвратите закрытие формы.
Тем не менее, было бы лучше, если бы ошибки проверки отображались в строке (путем выделения некорректных полей каким-либо образом, отображения всплывающих подсказок и т. Д.) и не позволять пользователю выбирать ОК кнопку в первую очередь.
Это прямо не отвечает на ваш вопрос (другие уже есть), но с точки зрения юзабилити я бы предпочел, чтобы оскорбительная кнопка была отключена, пока ввод недействителен.
Вы, вероятно, сможете проверить форму до того, как пользователи нажмут кнопку OK. Если это не вариант, откройте окно сообщения о том, что что-то не так, и повторно откройте форму с предыдущим состоянием.
Не используйте для этого событие FormClosing, вам нужно разрешите пользователю закрыть диалоговое окно, нажав кнопку «Отмена» или щелкнув X. Просто реализуйте обработчик события Click кнопки OK и не закрывайте его, пока не будете довольны:
private void btnOk_Click(object sender, EventArgs e) {
if (ValidateControls())
this.DialogResult = DialogResult.OK;
}
Где «ValidateControls» - ваша логика проверки. Верните false, если что-то не так.
Хотелось бы, чтобы у меня было время найти лучший пример, но для этого было бы намного лучше использовать существующие методы проверки форм Windows.
Вы можете поймать FormClosing и заставить форму оставаться открытой. используйте для этого свойство Cancel объекта аргумента события.
e.Cancel = true;
и это должно остановить закрытие вашей формы.