防止在按钮的单击事件处理程序中关闭对话框

我有一个对话框,我显示与 <class>.ShowDialog()。它有一个 OK 按钮和一个 Cancel 按钮; OK 按钮还有一个事件处理程序。

我想在事件处理程序中进行一些输入验证,如果失败了,就用消息框通知用户,防止对话框关闭。我不知道如何做最后一部分(防止关闭)。

91238 次浏览

您可以在用户点击 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,可以防止窗体关闭。

然而,在 内显示验证错误(通过某种方式突出显示违规字段,显示工具提示等) < strong > 并防止用户首先选择 OK 按钮,这将是一种更好的设计/用户体验。

您可以捕捉到 FormClose,在那里强制窗体保持打开状态。 使用事件参数对象的 Cancel 属性。

e.Cancel = true;

它应该可以阻止你的形式关闭。

这并不能直接回答你的问题(其他人已经回答了) ,但是从可用性的角度来看,我更希望在输入无效时禁用这个有问题的按钮。

我希望我有时间找到一个更好的例子,但您最好使用现有的 Windows 表单验证技术来完成这项工作。

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

不要使用表单关闭事件,你需要允许用户通过取消或者点击 X 来关闭对话框。只需要实现 OK 按钮的 Click 事件处理程序,直到你满意了才关闭:

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;
}

它的问题是,用户必须循环两次按钮关闭的形式;

可以通过将表单的 DialogResult设置为 DialogResult.None来取消关闭。

Button1是 AcceptButton 的示例:

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

当用户单击 button1并验证方法返回 false 时,窗体将不会关闭。

只需在事件函数中添加一行

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;
}