【问题标题】:WinForms Close() sets DialogResult to CancelWinForms Close() 将 DialogResult 设置为 Cancel
【发布时间】:2011-08-23 15:45:08
【问题描述】:

如果我在我的 WinForm 中调用 Close(),似乎即使 DialogResult 当时是 None,在我调用 Close() 之后,我看到它被设置为 Cancel。

这听起来正常吗?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    或者更简单,您可以在关闭之后设置 DialogResult。例如,假设 ValidateSettings 将向用户显示表单的任何问题,否则返回 true:

        private void btnOK_Click(object sender, EventArgs e)
        {
            if (ValidateSettings())
            {
                SaveSettings();
                Close();
                DialogResult = DialogResult.OK;
            }
        }
    

    【讨论】:

    • 注意:在WPF中你不能在表单关闭后更改Window.DialogResult
    • @Zéiksz - 好的,但这是一个 Winforms 问题,代码是我在该环境中测试的 Winforms 答案。也有人可能会否决它,因为它在 Ruby on Rails 上不起作用,但这似乎有点不公平。或者我错过了什么,因为我已经在 J​​ava 中工作了这么久。 :)
    • 我没有投反对票之类的……只是注意到了一些 WPF 信息。有点离题,是的,但是对于那些实际研究这个问题的人来说,你的答案有用的扩展(就像我所做的那样,并且认为其他人也可能使用这些信息 - 就在这里)。很抱歉,如果您认为这是冒犯,请说出来,我会删除评论。
    • 这应该被标记为正确的答案,因为大多数人在正常情况下会关闭一个对话框并且通常不想覆盖默认行为。
    【解决方案2】:

    这是完全正常的,因为这是预期的行为。但是,如果您使用的是 MDI 或ShowDialog(),则不等同于单击表单右上角的红色“X”。

    当表单显示为模式对话框时,单击关闭 按钮(表单右上角带有 X 的按钮) 导致表单被隐藏并设置 DialogResult 属性 到 DialogResult.Cancel。不会自动调用 Close 方法 当用户单击对话框的关闭按钮或设置 DialogResult 属性的值。相反,表单是隐藏的,并且 可以再次显示而无需创建对话框的新实例。 由于这种行为,您必须调用窗体的 Dispose 方法 当您的应用程序不再需要该表单时。

    DialogResult 值可以被覆盖:

    您可以在以下情况下覆盖分配给 DialogResult 属性的值 用户通过设置 DialogResult 属性单击关闭按钮 在表单的 Closing 事件的事件处理程序中。

    http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=VS.100).aspx

    【讨论】:

    • 是否有任何文档实际描述了将 DialogResult 值设置为 Cancel 的 Close() 方法的正常预期行为?
    • 我找不到。但是,Close() 和单击关闭按钮的唯一区别是,如果满足上述条件,则不会释放 Form。这意味着对 DialogResult 的分配是相同的(取消)。如果需要为None,可以使用上面的方法覆盖。
    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多