c# - 当按下按钮时关闭模态对话框时打开表单,即使没有调用 Close()

标签 c# winforms

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

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

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

    frmSettings.ShowDialog();
}

SettingsForm 类基本上有三个 GroupBox 控件,每个控件都有一个 LabelTextBox 控件,并且底部有 4 个 Button 控件:“Advanced...”“Restore Defaults”“Cancel”“应用”。每个 TextBox 都有一个通过设计器连接的 Validating 事件处理程序。每个按钮都有一个通过设计器连接的 Click 处理程序。它们中的每一个都做了非常明显的事情:打开另一个具有更高级设置的模式对话框,将文本框恢复为默认值,关闭对话框或保存更改,触发 ConfigurationChanged 事件,然后 然后关闭对话框(但前提是所有字段都有效!)。

当出现表单输入错误时,我通过设置 ((CancelEventArgs)e).Cancel = true 取消相应的 Validating 事件。但是,这两种形式的默认行为都是防止用户在验证失败时改变焦点。我发现这很烦人,最终在设计器中找到了一个选项,当用户离开该字段时仍然自动验证,但即使验证失败也允许他们离开: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));
    }
}

我目前正在通过在第一行中断并逐行逐步执行该方法来测试代码。本质上,ValidateChildren 按预期返回 false,并且跳过整个 if block ,包括 this.Close()。然而,如果我一直走到方法的底部然后退出它,我最终会回到 frmSettingsForm.ShowDialog() 行并且表单神奇地关闭。

“应用” 按钮设置为表单的 AcceptButton。我想知道它是否隐式地将处理程序附加到按钮的 Click 事件以在按下按钮时自动关闭表单。这听起来不符合逻辑,尤其是考虑到似乎没有办法取消 Click 事件,但这是我能想到的唯一解释。为了验证该理论,我尝试取消设置设计器中的 AcceptButton,但当数据无效时我的表单仍然关闭。

什么在关闭我的表单,我该如何停止?

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

最佳答案

ButtonDialogResult 设置了吗?如果是这样,当您单击 Button 时,FormDialogResult 将设置为该值,模态 Form 将关闭。为防止这种情况,当您的 Click 处理程序中的验证失败时,将 FormDialogResult 设置为 DialogResult.None .

关于c# - 当按下按钮时关闭模态对话框时打开表单,即使没有调用 Close(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4053794/

相关文章:

C#:如何测试基本线程 worker 类

c# - 使用泛型更新特定属性 (Winform C#)

c# - 在单独的后台线程与进程中运行长时间后台任务

c# - C# 中的多线程使用 Invoke 方法给出错误

.net - 如何处理在较新版本的 .NET(3.5 以上)中数据绑定(bind)期间发生的异常?

c# - 暂时禁用关闭按钮

c# - 是否可以防止 Visual Studio 在 BackgroundWorker.DoWork 内出现异常时中断

c# - winforms中滚动条处理滚动事件

c# - 使用 Rtmp 将视频流式传输到流媒体服务

c# - 如何在移动设备上的 Unity3d 中实现多点触控?