open - show vs showdialog c#
¿Es posible sobrecargar el método ShowDialog para formularios y devolver un resultado diferente? (4)
Editar: Probablemente no sea una buena idea cambiar la funcionalidad de ShowDialog()
, la gente espera que regrese un DialogResult
y muestre el formulario. Sugiero algo así como mi sugerencia a continuación. Por lo tanto, aún se permite ShowDialog()
de la manera normal.
Puede crear un método estático en su MyForm
, algo así como DoShowGetResult()
que se vería algo como esto
public static MyResultsForm DoShowGetResult()
{
var f = new MyForm();
if(f.ShowDialog() == DialogResult.OK)
{
return f.Result; // public property on your form of the result selected
}
return null;
}
entonces puedes usar esto
MyFormsResult result = MyForm.DoShowGetResult();
EDITAR: Este método realmente funciona muy bien y lo pregunté y luego encontré la solución. Agregué la llamada correcta en el método ShowDialog () sobrecargado (no es exactamente una sobrecarga, o incluso una anulación, pero funciona igual. Mi nueva pregunta es la que está en la parte inferior.
Tengo un formulario en el que haces clic en uno de los tres botones. He definido una enumeración para los resultados devueltos. Quiero hacer la llamada:
MyFormResults res = MyForm.ShowDialog();
Puedo agregar un nuevo método ShowDialog con este código:
public new MyFormResults ShowDialog()
{
//Show modal dialog
base.ShowDialog(); //This works and somehow I missed this
return myResult; //Form level variable (read on)
}
Establecí una variable de nivel de formulario para el resultado cuando se hace clic en los botones:
MyFormResults myResult;
private void btn1_click(object sender, EventArgs e)
{
myResult = MyFormsResults.Result1;
this.DialogResult = DialogResult.OK; //Do I need this for the original ShowDialog() call?
this.Close(); //Should I close the dialog here or in my new ShowDialog() function?
}
//Same as above for the other results
Lo único que me falta es el código para mostrar el diálogo (modal) y luego devolver mi resultado. No hay base.ShowDialog()
función base base.ShowDialog()
, entonces ¿cómo hago esto?
EDITAR: Hay un ''base.ShowDialog ()'' y funciona. Esta es mi nueva pregunta aquí:
Además, ¿es esta la mejor manera de hacer todo esto y por qué?
Gracias.
El método ShowDialog
no puede ser ShowDialog
. Sin embargo, lo que podría hacer es crear un nuevo método que devuelva tanto el resultado de ShowDialog como otro valor.
public ShowDialogResult ShowDialogWrappe(out MyFormResults result) {
var dialogRet = ShowDialog();
result = MyFormResults.Result1;
return dialogRet;
}
No, no es posible. La solución habitual es exponer su resultado real como una propiedad en el Formulario:
pubic MyFormResults MyResult
{
get;
}
y tú establecerías esto:
private void btn1_click(object sender, EventArgs e)
{
MyResult = MyFormsResults.Result1;
this.DialogResult = DialogResult.OK; //Do I need this for the original ShowDialog() call?
this.Close(); //Should I close the dialog here or in my new ShowDialog() function?
}
y el código de llamada por lo general se ve así:
if (form.ShowDialog == DialogResult.OK)
{
//do something with form.MyResult
}
Prueba esto, parece funcionar para mí:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public DialogResult ShowDialog(string mes)
{
this.textBox1.Text = mes;
return base.ShowDialog();
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}