WinForms Close()将DialogResult设置为Cancel

Fer*_*ndo 25 c# winforms

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

这听起来不正常吗?

Joh*_*ood 31

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

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

  • @Zéiksz - 好的,但这是一个Winforms问题,代码是我在该环境中测试的Winforms答案.有人可能也会对它进行投票,因为它不适用于Ruby on Rails,但这似乎有点不公平.或者我错过了什么,因为我一直在Java工作.:) (2认同)

Eva*_*ski 24

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

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

但是DialogResult可以覆盖该值:

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

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