2011-08-23 19 views

Respuesta

17

Eso es completamente normal, ya que es el comportamiento previsto. Sin embargo, no es equivalente a hacer clic en la "X" roja en la esquina superior derecha del Formulario si está utilizando un MDI o ShowDialog().

Cuando se muestra un formulario como un cuadro de diálogo modal, haga clic en el botón Cerrar (el botón con una X en la esquina superior derecha del formulario) causa la forma que se oculta y la propiedad DialogResult a establecer en DialogResult.Cancel. El método Cerrar no se llama automáticamente cuando el usuario hace clic en el botón Cerrar de un cuadro de diálogo o establece el valor de la propiedad DialogResult. En su lugar, el formulario está oculto y se puede volver a mostrar sin crear una nueva instancia del cuadro de diálogo. Debido a este comportamiento, debe llamar al método Dispose del formulario cuando la aplicación ya no necesita el formulario.

El valor DialogResult se puede anular sin embargo:

puede invalidar el valor asignado a la propiedad DialogResult cuando el usuario hace clic en el botón Cerrar estableciendo la propiedad DialogResult en un controlador de eventos para el Evento de cierre del formulario.

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

+0

¿Hay alguna documentación que en realidad describe el comportamiento normal, previsto del método Close() estableciendo el valor DialogResult cancelar? – Fernando

+0

No es que pudiera encontrarlo. Sin embargo, la única diferencia entre Cerrar() y hacer clic en el botón Cerrar es que el Formulario no se elimina si se cumplen las condiciones anteriores. Eso significa que la asignación a DialogResult es la misma (Cancelar). Si necesita que sea Ninguno, se puede anular utilizando el método anterior. –

24

O incluso más fácil, puede establecer DialogResult justo después de cerrar. Por ejemplo, ValidateSettings suponiendo que se mostrarán al usuario ningún problema con la forma o devolver cierto lo contrario:

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

Nota: En WPF no puede cambiar 'Window.DialogResult' después de cerrar el formulario. –

+1

@ Zéiksz - OK, pero esta es una pregunta de Winforms y el código fue una respuesta de Winforms que probé en ese entorno. Uno también podría votar por él porque no funciona en Ruby on Rails, pero parece un poco injusto. O me estoy perdiendo algo porque he estado trabajando en Java por tanto tiempo. :) –

+0

No perdoné ni nada ... solo noté algo de información de WPF. Poco oftálmico, sí, pero una extensión útil para su respuesta para aquellos que realmente están investigando en esta pregunta (como yo lo hice, y pensé que otros también podrían usar la información, aquí mismo). Lo siento si lo tomó como una ofensa, dígalo y remuevo el comentario. –

Cuestiones relacionadas