防止在button的单击事件处理程序中closures对话框

我有一个对话框,我用<class>.ShowDialog() 。 它有一个确定button和一个取消button; 确定button也有一个事件处理程序。

我想在事件处理程序中进行一些inputvalidation,如果失败,则通过消息框通知用户并阻止对话框closures。 我不知道如何做最后一部分(防止closures)。

鉴于你已经指定了你想要一个popup错误对话框 ,一个这样做的方法是将你的validation移动到一个OnClosing事件处理程序。 在这个例子中,如果用户对对话框中的问题回答“是”,表单closures就会中止。

 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您将阻止表单closures。

但是,在内联中显示validation错误 (通过以某种方式突出显示有问题的字段,显示工具提示等) 来显示validation错误 并防止用户首先select“确定”button 将会是更好的devise/用户体验

您可以通过将窗体的DialogResult设置为DialogResult来取消closures。

button1是AcceptButton的示例:

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

当用户点击button1并且validate方法返回false时,表单不会被closures。

不要使用FormClosing事件,你需要允许用户使用Cancel或者点击X来closures对话框。只需要实现OKbutton的Click事件处理程序,并且不要closures,直到你感到满意:

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

其中“ValidateControls”是您的validation逻辑。 如果有什么问题,请返回false。

这不直接回答你的问题(其他已经有),但从可用性的angular度来看,我宁愿在input无效时禁用违规button。

使用此代码:

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

问题是用户必须按两次button才能closures表单;

你可以捕捉FormClosing那里的强制表单保持打开状态。 使用事件参数对象的Cancel属性。

 e.Cancel = true; 

它应该阻止你的表单closures。

用户点击确定button之前,您可能可以检查表单。 如果这不是一个选项,那么打开一个消息框,说出事情是错误的,重新打开以前的状态的forms。

我希望我有时间find一个更好的例子,但使用现有的窗体validation技术来做这件事情会更好。

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

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

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