我正在编写一个基本上在后台运行的Windows应用程序,其中包含一个与之交互的通知图标.通知图标可以执行基本操作,例如退出应用程序或显示有关它的信息.它还可以启动模态配置对话框.
创建对话框的代码非常简单:
using(var frmSettings = new SettingsForm(configuration))
{
frmSettings.ConfigurationChanged += ConfigurationChangedHandler;
frmSettings.UnhandledException += UnhandledExceptionHandler;
frmSettings.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)
的SettingsForm类主要有3所GroupBox控制,具有Label和TextBox控制在每个和4个Button控制在底部:"Advanced...","Restore Defaults","Cancel",和"Apply".每个TextBox都有一个Validating通过设计器连接的事件处理程序.每个按钮都有一个Click通过设计器连接的处理程序.它们中的每一个都做了非常明显的事情:打开另一个具有更高级设置的模态对话框,将文本框恢复为默认值,关闭对话框或保存更改,触发ConfigurationChanged事件,然后关闭对话框(但仅当所有字段都是有效!).
当表单输入错误时,我Validating通过设置取消相应的事件((CancelEventArgs)e).Cancel = true.但是,两种表单的默认行为是防止用户在验证失败时更改焦点.我发现这很烦人,最终发现设计师中的选项仍然会在用户离开字段时自动验证,但即使验证失败也允许它们离开:AutoValidate = EnableAllowFocusChange.[1]
我的"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));
}
}
Run Code Online (Sandbox Code Playgroud)
我目前正在通过打破第一行并逐行逐步执行代码来测试代码.基本上,ValidateChildren正如预期的那样返回false,并且跳过整个if块,包括this.Close()跳过.然而,如果我一直走到方法的底部,然后走出它,我最终回到frmSettingsForm.ShowDialog()线上,表格神奇地关闭.
该"Apply"按钮被设置为形式的AcceptButton.我想知道它是否隐含地附加了按钮Click事件的处理程序,以便在按下按钮时自动关闭表单.这听起来不像逻辑上应该假设,特别是考虑到似乎没有办法取消Click事件,但这是我能想出的唯一解释.为了测试这个理论,我尝试AcceptButton在设计器中取消设置,但是当数据无效时我的表单仍然关闭.
什么是关闭我的表格,我该如何阻止它?
[1]:如果其他人找不到它,它就是一个表格属性,而不是每个单独控件的属性(正如我预期的那样).
你有DialogResult这Button套装吗?如果是这样,当你点击它时Button,它DialogResult的设置Form将被设置为该值,模态Form将关闭.要防止这种情况发生,当Click处理程序中的验证失败时,请将Form's 设置DialogResult为DialogResult.None.