Препятствование тому, чтобы диалоговое окно закрылось в обработчике события Click кнопки

У меня есть диалоговое окно, с которым я показываю <class>.ShowDialog(). Это имеет кнопку OK и Кнопку отмены; кнопка OK также имеет обработчик событий.

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

63
задан qster 23 March 2010 в 12:03
поделиться

6 ответов

Учитывая, что вы указали, что хотите отображать всплывающее диалоговое окно с ошибкой , один из способов сделать это - переместить вашу проверку в 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 , вы предотвратите закрытие формы.

Тем не менее, было бы лучше, если бы ошибки проверки отображались в строке (путем выделения некорректных полей каким-либо образом, отображения всплывающих подсказок и т. Д.) и не позволять пользователю выбирать ОК кнопку в первую очередь.

45
ответ дан 24 November 2019 в 16:05
поделиться

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

3
ответ дан 24 November 2019 в 16:05
поделиться

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

-1
ответ дан 24 November 2019 в 16:05
поделиться

Не используйте для этого событие FormClosing, вам нужно разрешите пользователю закрыть диалоговое окно, нажав кнопку «Отмена» или щелкнув X. Просто реализуйте обработчик события Click кнопки OK и не закрывайте его, пока не будете довольны:

private void btnOk_Click(object sender, EventArgs e) {
  if (ValidateControls())
    this.DialogResult = DialogResult.OK;
}

Где «ValidateControls» - ваша логика проверки. Верните false, если что-то не так.

16
ответ дан 24 November 2019 в 16:05
поделиться

Хотелось бы, чтобы у меня было время найти лучший пример, но для этого было бы намного лучше использовать существующие методы проверки форм Windows.

http://msdn.microsoft.com/en-us/library/ms229603.aspx

0
ответ дан 24 November 2019 в 16:05
поделиться

Вы можете поймать FormClosing и заставить форму оставаться открытой. используйте для этого свойство Cancel объекта аргумента события.

e.Cancel = true;

и это должно остановить закрытие вашей формы.

2
ответ дан 24 November 2019 в 16:05
поделиться