WinForms Close()将DialogResult设置为Cancel

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

这听起来不正常吗?

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

当窗体显示为模式对话框时,单击“关闭”按钮(窗体右上角带有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

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

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