WinForms的Close()方法将DialogResult设置为Cancel。

29

如果我在我的WinForm中调用Close(),即使此时DialogResult为None,但在我调用Close()之后,我发现它被设置为Cancel。

这听起来正常吗?

2个回答

43

或者更简单的方法是,在关闭窗体后立即设置DialogResult。例如,假设ValidateSettings将向用户显示表单中的任何问题或返回true:

或者更简单的方法是在Close之后立即设置DialogResult。例如,假设ValidateSettings将显示表单中的任何问题并向用户返回true:
    private void btnOK_Click(object sender, EventArgs e)
    {
        if (ValidateSettings())
        {
            SaveSettings();
            Close();
            DialogResult = DialogResult.OK;
        }
    }

注意:在WPF中,窗口关闭后无法更改Window.DialogResult - Zéiksz
3
@Zéiksz - 好的,但这是一个Winforms问题,而那段代码是我在该环境下测试过的Winforms答案。如果有人因为它不能在Ruby on Rails上运行而将其投票降低分数,这似乎有点不公平。或者是因为我已经在Java中工作了很长时间,所以我错过了什么 :) - John Lockwood
我没有点踩或者什么的……只是注意到了一些关于WPF的信息。有点离题,但对于那些真正在研究这个问题的人来说,这是一个有用的扩展答案(就像我一样,并且认为其他人也可以使用这些信息——就在这里)。如果你把它当作冒犯了,告诉我,我会删除这条评论。 - Zéiksz
这应该被标记为正确答案,因为在正常情况下,大多数人都关闭单个对话框,并且通常不希望覆盖默认行为。 - Wilmer SH

26

这是完全正常的行为,这是预期的。但是,如果您正在使用一个 MDI 或 ShowDialog(),它不等同于点击表单右上角的红色 "X"。

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

但是,DialogResult 值可以被覆盖:

您可以在窗体的 Closing 事件处理程序中设置 DialogResult 属性,从而覆盖用户单击关闭按钮时分配给 DialogResult 属性的值。

http://msdn.microsoft.com/zh-cn/library/system.windows.forms.form.dialogresult.aspx


1
有没有任何文档实际描述了 Close() 方法将 DialogResult 值设置为 Cancel 的正常预期行为? - Fernando
我没有找到其他的方法。然而,Close() 和点击关闭按钮之间唯一的区别是,如果满足上述条件,Form 不会被处理。这意味着 DialogResult 的赋值是相同的(Cancel)。如果需要它为 None,则可以使用上面的方法进行覆盖。 - Evan Mulawski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接