Предотвращение закрытия диалога в обработчике события нажатия кнопки - PullRequest
62 голосов
/ 23 марта 2010

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

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

Ответы [ 10 ]

132 голосов
/ 04 ноября 2010

Вы можете отменить закрытие, установив DialogResult формы в DialogResult.None.

Пример, где button1 - это AcceptButton:

private void button1_Click(object sender, EventArgs e) {
  if (!validate())
     this.DialogResult = DialogResult.None;
}

Когда пользователь нажимает кнопку 1 и метод validate возвращает false, форма не будет закрыта.

44 голосов
/ 23 марта 2010

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

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

16 голосов
/ 23 марта 2010

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

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

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

3 голосов
/ 23 сентября 2010

Используйте этот код:

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

Проблема в том, что пользователь должен дважды щелкнуть по кнопкам для закрытия форм;

3 голосов
/ 23 марта 2010

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

2 голосов
/ 23 марта 2010

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

e.Cancel = true;

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

0 голосов
/ 23 июня 2017
void SaveInfo()
{
blnCanCloseForm = false;
Vosol[] vs = getAdd2DBVosol();
if (DGError.RowCount > 0)
return;

Thread myThread = new Thread(() =>
{
this.Invoke((MethodInvoker)delegate {
    picLoad.Visible = true;
    lblProcces.Text = "Saving ...";
});
int intError = setAdd2DBVsosol(vs);
Action action = (() =>
{
    if (intError > 0)
    {
        objVosolError = objVosolError.Where(c => c != null).ToArray();
        DGError.DataSource = objVosolError;// dtErrorDup.DefaultView;
        DGError.Refresh();
        DGError.Show();
        lblMSG.Text = "Check Errors...";
    }
    else
    {
        MessageBox.Show("Saved All Records...");
        blnCanCloseForm = true;
        this.DialogResult = DialogResult.OK;
        this.Close();
    }

});
this.Invoke((MethodInvoker)delegate {
    picLoad.Visible = false;
    lblProcces.Text = "";
});
this.BeginInvoke(action);
});
myThread.Start();
}

void frmExcellImportInfo_FormClosing(object s, FormClosingEventArgs e)
{
    if (!blnCanCloseForm)
        e.Cancel = true;
}
0 голосов
/ 05 мая 2016

Просто добавьте одну строку в функцию события

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
             {
                this->DialogResult = System::Windows::Forms::DialogResult::None;
             }
0 голосов
/ 23 марта 2010

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

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

0 голосов
/ 23 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...