visual studio example ejemplo c# winforms dialogresult

c# - studio - Usar DialogResult Correctamente



showdialog c# ejemplo (2)

Cuando abre un cuadro de diálogo modal con ShowDialog, el código de llamada se bloquea hasta que el formulario llamado cierra u oculta. Si desea leer algunas propiedades públicas del formulario llamado y quiere hacer cosas (por ejemplo, guardar datos en una base de datos o en un archivo) basándose en el clic en el botón Aceptar o Cancelar, entonces necesita saber si el usuario desea para hacer la acción o no. DialogResult devuelto por el método ShowDialog () le permite tomar las acciones apropiadas ...

Así por ejemplo

using (Form1 form = new Form1()) { DialogResult dr = form.ShowDialog(); if(dr == DialogResult.OK) { string custName = form.CustomerName; SaveToFile(custName); } }

En una respuesta a una pregunta reciente que tuve ( Aquí ), Hans Passant afirmó que debería establecer DialogResult para cerrar mis formularios en lugar de form.Close() aunque parece que no puedo averiguar por qué?

Si he leído correctamente, la documentación de MSDN indica que al hacer esto simplemente se ocultará el formulario en lugar de deshacerse de él correctamente, lo cual creí. ¿ .Close() para hacer?

Extracto de la documentación.

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 cambio, 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 de eliminación del formulario cuando su aplicación ya no necesita el formulario.

Por otro lado, Microsoft ha creado una página de soporte que dice cómo usar la propiedad DialogResult y en la sección "Verify It Works" de este dice que al hacer clic cerrará el formulario.

Entonces mi pregunta es doble, si continúo usando Close o DialogResult en su lugar; y el resultado del cuadro de diálogo cierra u oculta un formulario. Del código que hice a continuación (un formulario simple con dos botones), parecería que de hecho está oculto solo como un punto de interrupción en esto this.Close() Se golpea this.Close() . (Con this.Close() comentó, el formulario aún desaparece , simplemente no estoy seguro si está oculto o no)

public Form1() { InitializeComponent(); button1.Click += (s, e) => { //I edited my question to include using using(Form1 form = new Form1()) { form.ShowDialog(); } }; button2.Click += (s, e) => { this.DialogResult = DialogResult.OK; this.Close(); }; }


Ya sea que llame a Close o establezca la propiedad DialogResult no es realmente el problema. Solo necesita asegurarse de llamar a Dispose . Prefiero hacer esto con un bloque de uso:

using (Form1 form = new Form1()) { form.ShowDialog(); }

Originalmente pensé que podías llamar a ShowDialog en un Form que ya ha llamado a su método Close . Este no es el caso. Si muestra el formulario de manera modal con ShowDialog , no parece importar si está cerrado como resultado del método Close o si establece la propiedad DialogResult . Parecería que configurar DialogResult es solo un atajo para cerrar el Form .

Pero ya sea que llame a Close o establezca la propiedad DialogResult , la clave es asegurarse de llamar a Dispose() o poner su formulario en un bloque de uso.