按下按钮时打开的模式窗口关闭,即使没有调用Close()

bam*_*ams 1 c# winforms

我正在编写一个基本上在后台运行的Windows应用程序,其中包含一个与之交互的通知图标.通知图标可以执行基本操作,例如退出应用程序或显示有关它的信息.它还可以启动模态配置对话框.

创建对话框的代码非常简单:

using(var frmSettings = new SettingsForm(configuration))
{
    frmSettings.ConfigurationChanged += ConfigurationChangedHandler;
    frmSettings.UnhandledException += UnhandledExceptionHandler;

    frmSettings.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

SettingsForm类主要有3所GroupBox控制,具有LabelTextBox控制在每个和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]:如果其他人找不到它,它就是一个表格属性,而不是每个单独控件的属性(正如我预期的那样).

Mik*_*our 9

你有DialogResultButton套装吗?如果是这样,当你点击它时Button,它DialogResult的设置Form将被设置为该值,模态Form将关闭.要防止这种情况发生,当Click处理程序中的验证失败时,请将Form's 设置DialogResultDialogResult.None.