visual tipos ejemplo dialogo cuadros winforms forms modal-dialog

winforms - tipos - Cuadro de diálogo modal de Windows Forms que devuelve un objeto en lugar de DialogResult



messagebox dialogresult c# (4)

Estoy un poco atrapado con esto, así que esperaba que alguien pudiera ayudarme.

Estoy haciendo una aplicación de Winforms y necesito mostrar un cuadro de diálogo modal (formulario.Distancia de registro) que devuelve un valor (solicita al usuario algunos valores y los envuelve en un objeto).

Simplemente no puedo ver cómo hacer esto en lugar de dar una referencia al objeto o dependiendo de alguna forma de Propiedad pública para leer los datos posteriormente.

Me gustaría que ShowDialog devuelva algo diferente, pero eso no funciona. ¿Hay alguna forma "buena" de hacer esto?

Estoy seguro de que el problema no es nuevo, pero como casi nadie parece hacer Winforms, no encuentro ninguna guía en la web.


Agregue un método estático a su formulario, como este:

public class MyDialog : Form { // todo: think of a better method name :) public static MyObject ShowAndReturnObject() { var dlg = new MyDialog(); if (new dlg.ShowDialog() == DialogResult.OK) { var obj = // construct an instance of MyObject from dlg return obj; } else { return null; } } }

Ahora puede llamar esto desde su programa de esta manera:

var myObject = MyDialog.ShowAndReturnObject();

... y si cancelan el diálogo, myObject será nulo.

Ahora, habiendo dicho todo eso, creo que agregar una propiedad a la clase de su formulario de la que luego lee después de llamar a ShowDialog () es el mejor enfoque.


La propiedad pública en el formulario de diálogo tiene sentido. Sin embargo, no cierre el cuadro de diálogo en el controlador de evento Ok click click. Cuando asigna la propiedad DialogResult, el formulario de diálogo estará oculto. Luego, en el formulario de llamada puede determinar si se hizo clic en Aceptar o en Cancelar al examinar DialogResult. Luego puede acceder a la propiedad pública si se hizo clic en el botón Aceptar y luego eliminar el formulario de diálogo. Esto se debe hacer usando un bloque try-catch-finally en el formulario de llamada o mediante una instrucción using. Debe deshacerse del diálogo modal para evitar una pérdida de memoria.


O puede crear un nuevo método ShowDialog dentro de su clase de formulario que básicamente hace lo que hace Matt Hamilton. Tal vez incluso un método de extensión si es algo que le haces a muchos formularios en tu problema.


Puede crear una propiedad pública dentro del Diálogo que represente el valor de retorno:

/* Caller Code */ var dlg = new MyDialog(); if(dlg.ShowDialog() == DialogResult.OK) MessageBox.Show(dlg.MyResult); /* Dialog Code */ public string MyResult { get { return textBox1.Text; } } private void btnOk_Click(object sender, EventArgs e) { DialogResult = System.Windows.Forms.DialogResult.OK; this.Close(); }