Cuadro de diálogo modal de formularios Windows Forms que devuelve un objeto en lugar de DialogResult

StackOverflow https://stackoverflow.com/questions/239435

  •  04-07-2019
  •  | 
  •  

Pregunta

Estoy un poco atorado con este, así que esperaba que alguien pudiera ayudarme.

Estoy haciendo una aplicación de Winforms y necesito mostrar un diálogo modal (form.ShowDialog) 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 algún tipo de propiedad pública para leer los datos posteriormente.

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

Estoy seguro de que el problema no es nuevo, pero dado que casi nadie parece hacer más Winforms, no puedo encontrar ninguna guía en la web.

¿Fue útil?

Solución

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 puedes llamar a esto desde tu programa así:

var myObject = MyDialog.ShowAndReturnObject();

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

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

Otros consejos

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();
}

O podría crear un nuevo método ShowDialog dentro de su clase de formulario que haga básicamente lo que hace Matt Hamilton. Tal vez incluso un método de extensión si es algo que haces con muchas formas en tu problema.

La propiedad pública en el cuadro de diálogo tiene sentido. Sin embargo, no cierre el cuadro de diálogo en el botón Aceptar, haga clic en el controlador de eventos. Cuando asigne la propiedad DialogResult, se ocultará el formulario de diálogo. Luego, en el formulario de llamada, puede determinar si se hizo clic en Aceptar o Cancelar examinando el 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 eliminar el diálogo modal para evitar una pérdida de memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top