Предотвращение закрытия диалогового окна в обработчике событий нажатия кнопки
У меня есть диалог, который я показываю с помощью <class>.ShowDialog()
. Он имеет кнопку "ОК" и кнопку "Отмена"; кнопка OK также имеет обработчик событий.
Я хочу сделать некоторую проверку ввода в обработчике событий и, если он не удается, уведомить пользователя с полем сообщения и не допустить закрытия диалогового окна. Я не знаю, как сделать последнюю часть (предотвращая закрытие).
Ответы
Ответ 1
Учитывая, что вы указали, что вам нужен диалог с ошибкой по умолчанию, одним из способов сделать это является перенос вашей проверки на 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
, вы не сможете закрыть форму.
Однако лучше было бы отображать ошибки проверки inline (с помощью выделения видимых полей, отображения всплывающих подсказок и т.д.) и предотвращать пользователя от выбора кнопки ОК в первую очередь.
Ответ 2
Вы можете отменить закрытие, установив форму DialogResult
на DialogResult.None
.
Пример, где button1 является AcceptButton:
private void button1_Click(object sender, EventArgs e) {
if (!validate())
this.DialogResult = DialogResult.None;
}
Когда пользователь нажимает кнопку1, а метод validate возвращает false, форма не будет закрыта.
Ответ 3
Не используйте для этого событие FormClosing, вы хотите разрешить пользователю отклонять диалог либо отменить, либо щелкнуть X. Просто реализовать кнопку OK Нажмите Обработчик событий и не закрывайте, пока не будете счастливы
private void btnOk_Click(object sender, EventArgs e) {
if (ValidateControls())
this.DialogResult = DialogResult.OK;
}
Где "ValidateControls" - ваша логика проверки. Верните false, если что-то не так.
Ответ 4
Это напрямую не отвечает на ваш вопрос (другие уже есть), но с точки зрения удобства использования я бы предпочел, чтобы кнопка нарушения была отключена, пока вход недействителен.
Ответ 5
Используйте этот код:
private void btnOk_Click(object sender, EventArgs e) {
if (ValidateControls())
this.DialogResult = DialogResult.OK;
}
Проблема заключается в том, что пользователю приходится дважды кликать кнопки для закрытия форм;
Ответ 6
Вы можете поймать FormClosing, чтобы форма оставалась открытой.
используйте свойство Cancel для объекта аргумента события для этого.
e.Cancel = true;
и он должен закрыть вашу форму.
Ответ 7
Вероятно, вы можете проверить форму до того, как пользователи нажмут кнопку OK. Если это не вариант, тогда откройте окно сообщения, в котором говорится, что что-то не так, и снова откройте форму с предыдущим состоянием.
Ответ 8
Хотелось бы, чтобы у меня было время найти лучший пример, но вам было бы гораздо лучше использовать существующие методы проверки форм Windows.
http://msdn.microsoft.com/en-us/library/ms229603.aspx
Ответ 9
Просто добавьте одну строку в функцию события
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
this->DialogResult = System::Windows::Forms::DialogResult::None;
}
Ответ 10
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;
}