我正在编写一个基本上在后台运行的Windows应用程序,其中包含一个与之交互的通知图标。通知图标可以执行基本操作,例如退出应用程序或显示有关它的信息。它还可以启动模态配置对话框。
创建对话框的代码非常简单:
using(var frmSettings = new SettingsForm(configuration))
{
frmSettings.ConfigurationChanged += ConfigurationChangedHandler;
frmSettings.UnhandledException += UnhandledExceptionHandler;
frmSettings.ShowDialog();
}
SettingsForm
类基本上有三个GroupBox
控件,每个控件都有Label
和TextBox
控件,底部有4个Button
控件:{ {1}},"Advanced..."
,"Restore Defaults"
和"Cancel"
。每个"Apply"
都有一个TextBox
事件处理程序通过设计器连接起来。每个按钮都有一个Validating
处理程序通过设计器连接。他们每个人都做了非常明显的事情:打开另一个模式对话框,其中包含更多高级设置,将文本框恢复为默认值,关闭对话框或保存更改,触发Click
事件,然后关闭对话框(但仅当所有字段都有效时!)。
如果表单输入错误,我会通过设置ConfigurationChanged
取消相应的Validating
事件。但是,两种表单的默认行为是防止用户在验证失败时更改焦点。我发现这很烦人,最终发现设计师中的选项仍然会在用户离开字段时自动验证,但即使验证失败也允许他们离开:((CancelEventArgs)e).Cancel = true
。[1]
我的AutoValidate = EnableAllowFocusChange
按钮"Apply"
处理程序基本上看起来像这样:
Click
我目前正在通过打破第一行并逐行逐步执行代码来测试代码。实际上,private void btnApply_Click(object sender, EventArgs e)
{
try
{
if(this.ValidateChildren())
{
this.Configuration.Field1 = this.txtField1.Text;
this.Configuration.Field2 = this.txtField2.Text;
this.Configuration.Field3 = this.txtField3.Text;
if(this.Configuration.Changed)
{
this.Configuration.Save();
this.OnConfigurationChanged(new ConfigurationChangedEventArgs(
this.Configuration));
}
this.Close();
}
}
catch(Exception ex)
{
this.OnUnhandledException(new UnhandledExceptionEventArgs(
"Failed To Apply Configuration Settings",
ex));
}
}
按预期返回false,并跳过整个ValidateChildren
块,包括if
。然而,如果我一直走到方法的底部,然后走出它,我最终回到this.Close()
线,表格神奇地关闭。
frmSettingsForm.ShowDialog()
按钮设置为表单"Apply"
。我想知道它是否隐含地将一个处理程序附加到按钮的AcceptButton
事件,以便在按下按钮时自动关闭表单。这听起来并不像逻辑上应该假设的那样,特别是考虑到似乎没有办法取消Click
事件,但这是我能想出的唯一解释。为了测试这个理论,我尝试在设计器中取消设置Click
,但是当数据无效时我的表单仍然关闭。
关闭我的表单是什么以及如何阻止它?
[1]:如果其他人找不到它,它就是一个表格属性,而不是每个单独控件的属性(正如我预期的那样)。
答案 0 :(得分:9)
您是否设置了DialogResult
的{{1}}?如果是这样,当您点击Button
时,Button
的{{1}}将设置为该值,模式DialogResult
将关闭。为防止这种情况发生,当您的Form
处理程序验证失败时,请将Form
的{{1}}设置为Click
。
答案 1 :(得分:0)
我不知道为什么会发生这种情况,但您可以覆盖事件 OnFormClosing 并根据您的逻辑检查 DialogResult 的值。
If (DialogResult != Windows.Forms.DialogResult.Cancel )
e.Cancel = True