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

时间:2010-10-29 16:15:40

标签: c# winforms

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

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

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

    frmSettings.ShowDialog();
}

SettingsForm类基本上有三个GroupBox控件,每个控件都有LabelTextBox控件,底部有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]:如果其他人找不到它,它就是一个表格属性,而不是每个单独控件的属性(正如我预期的那样)。

2 个答案:

答案 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