Предотвращение закрытия диалогового окна в обработчике событий щелчка кнопки
У меня есть диалог, который я показываю с <class>.ShowDialog(). Он имеет кнопку " ОК " и "отмена"; кнопка " ОК " также имеет обработчик событий.
Я хочу сделать некоторую проверку ввода в обработчике событий и, если это не удается, уведомить Пользователя с помощью окна сообщения и предотвратить закрытие диалогового окна. Я не знаю, как сделать последнюю часть (предотвращение закрытия).
10 ответов:
учитывая, что вы указали, что хотите диалоговое окно pop error, один из способов сделать это-переместить вашу проверку в
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 (через выделение нарушителя полей в некотором роде, отображение подсказок и т. д.)и предотвратить пользователь от выбора кнопки OK в первую очередь.
вы можете отменить закрытие, установив форму
DialogResulttoDialogResult.None.пример, где button1 является AcceptButton:
private void button1_Click(object sender, EventArgs e) { if (!validate()) this.DialogResult = DialogResult.None; }когда пользователь нажимает кнопку button1 и метод validate возвращает false, форма не будет закрыта.
Не используйте для этого событие FormClosing, вы хотите, чтобы пользователь мог закрыть диалоговое окно с помощью отмены или нажатия X. просто реализуйте обработчик событий Click кнопки OK и не закрывайте, пока не будете счастливы:
private void btnOk_Click(object sender, EventArgs e) { if (ValidateControls()) this.DialogResult = DialogResult.OK; }где "ValidateControls" - это ваша логика проверки. Возвращает false, если что-то не так.
Это не дает прямого ответа на ваш вопрос (другие уже есть), но с точки зрения удобства использования я бы предпочел, чтобы оскорбительная кнопка была отключена, пока вход не действителен.
используйте этот код:
private void btnOk_Click(object sender, EventArgs e) { if (ValidateControls()) this.DialogResult = DialogResult.OK; }проблема в том, что пользователь должен кликнуть два раза кнопки для закрытия форм;
вы можете поймать FormClosing там заставить форму оставаться открытой. для этого используйте свойство Cancel объекта аргумента события.
e.Cancel = true;и это должно остановить вашу форму от закрытия.
вероятно, вы можете проверить форму, прежде чем пользователи нажмут кнопку OK. Если это не вариант, откройте окно сообщения о том, что что-то не так, и снова откройте форму с предыдущим состоянием.
Я хотел бы иметь время, чтобы найти лучший пример, но вам было бы гораздо лучше использовать существующие методы проверки windows forms для этого.
просто добавьте одну строку в функцию события
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { this->DialogResult = System::Windows::Forms::DialogResult::None; }
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; }
Comments