¿Es posible sobrecargar el método ShowDialog de formas y devolver un resultado diferente?
-
04-10-2019 - |
Pregunta
EDIT: Este método funciona realmente bien y me preguntó entonces encontró la solución más adelante. He añadido la llamada al método correcto en el ShowDialog sobrecargada () (no es exacly una sobrecarga, o incluso una anulación, pero funciona de la misma manera. Mi nueva pregunta es la que está en la parte inferior.
Tengo un formulario en el que hace clic en uno de los tres botones. He definido una enumeración de los resultados devueltos. Quiero hacer la llamada:
MyFormResults res = MyForm.ShowDialog();
Me puede añadir 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)
}
I establece 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 cuadro de diálogo (modal) y luego regresar mi resultado. No hay ninguna función base.ShowDialog()
, así que ¿cómo lo hago?
EDIT: Hay una 'base.ShowDialog ()' y funciona. Esta es mi nueva pregunta aquí:
Además, es ésta la mejor manera de hacer todo esto y por qué?
Gracias.
Solución
Edit: No es proberly una buena idea para cambiar la funcionalidad de ShowDialog()
, la gente espera que devuelva un DialogResult
y mostrar el formulario, le sugiero algo así como mi sugerencia a continuación. Por lo tanto, sigue permitiendo ShowDialog()
para ser utilizado de la manera normal.
Se puede crear un método estático en su MyForm
, algo así como DoShowGetResult()
que ser 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;
}
A continuación, puede utilizar esta ??p>
MyFormsResult result = MyForm.DoShowGetResult();
Otros consejos
Prueba de esto, parece que funciona 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();
}
}
No, no es posible. La solución habitual es exponer el resultado real como una propiedad en el formulario:
public MyFormResults MyResult
{
get;
}
y se establecería entonces la siguiente:
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 es el siguiente:
if (form.ShowDialog == DialogResult.OK)
{
//do something with form.MyResult
}
El método ShowDialog
no puede ser sobreescrito. Lo que podría hacer intead aunque es crear un nuevo método que devuelve el resultado tanto ShowDialog y otro valor.
public ShowDialogResult ShowDialogWrappe(out MyFormResults result) {
var dialogRet = ShowDialog();
result = MyFormResults.Result1;
return dialogRet;
}