代码之家  ›  专栏  ›  技术社区  ›  bambams

当按下按钮时,作为模式对话框打开的窗体将关闭,即使未调用close()。

  •  1
  • bambams  · 技术社区  · 15 年前

    我正在编写一个Windows应用程序,它基本上在后台运行,带有一个通知图标来与之交互。通知图标可以做一些基本的事情,如退出应用程序或显示有关它的信息。它还可以启动模式配置对话框。

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

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

    这个 SettingsForm 班级基本上有三个 GroupBox 控件,带有 Label TextBox 各控制,4 Button 底部的控件: "Advanced..." , "Restore Defaults" , "Cancel" "Apply" . 各 文本框 有一个 Validating 事件处理程序通过设计器连接起来。每个按钮都有一个 Click 处理程序通过设计器连接起来。它们中的每一个都非常明显:用更高级的设置打开另一个模式对话框,将文本框还原为其默认值,关闭对话框,或保存更改,激发 ConfigurationChanged 事件,以及 然后 关闭对话框(但仅当所有字段都有效时!).

    当有表单输入错误时,我取消相应的 验证 按设置的事件 ((CancelEventArgs)e).Cancel = true . 但是,这两个表单的默认行为是防止用户在验证失败时更改焦点。我发现这很烦人,最终发现设计器中的选项仍然可以在用户离开字段时自动验证,但允许他们离开,即使验证失败: AutoValidate = EnableAllowFocusChange 〔1〕

    我的 “申请” 按钮 点击 处理程序基本上如下所示:

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

    我目前正在测试代码,方法是在第一行中断,然后一行一行地通过方法。基本上, ValidateChildren 按预期返回假 if 块,包括 this.Close() 跳过。然而,如果我一路走到方法的底部,然后离开它,我最终会回到 frmSettingsForm.ShowDialog() 线条和形状神奇地闭合了。

    这个 “申请” 按钮设置为窗体的 AcceptButton . 我想知道它是否隐式地将一个处理程序附加到按钮的 点击 事件在按下按钮时自动关闭窗体。这听起来不符合逻辑,尤其是考虑到似乎没有一种方法可以取消 点击 但这是我唯一能想到的解释。为了检验这一理论,我试图使 默认按钮 在设计器中,但当数据无效时,窗体仍将关闭。

    什么是关闭我的表格,我如何阻止它?

    [1]:如果其他人找不到它,它是一个窗体属性,而不是每个单独控件的属性(如我预期的那样)。

    2 回复  |  直到 10 年前
        1
  •  9
  •   Mike Dour    15 年前

    你有没有 DialogResult Button 集合?如果是,单击 纽扣 , the 对话结果 Form 将设置为该值和模式 形式 将关闭。为了防止出现这种情况,当验证失败时, Click 处理程序,设置 形式 对话结果 DialogResult.None .

        2
  •  0
  •   Ed_    10 年前

    我不知道为什么会这样,但你可以忽略这件事 OnFalm关闭 并检查 对话结果 根据你的逻辑。

      If (DialogResult != Windows.Forms.DialogResult.Cancel )
                e.Cancel = True
    
    推荐文章