2010-09-21 7 views
11

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 una sobrecarga, o incluso una anulación, pero funciona igual. Mi nueva pregunta es la que está en la parte inferior.¿Es posible sobrecargar el método ShowDialog para formularios y devolver un resultado diferente?

Tengo un formulario .. en la que hace clic en uno de los tres botones que he definido una enumeración de los resultados devueltos Quiero hacer la llamada:

MyFormResults res = MyForm.ShowDialog(); 

puedo 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) 
} 

Configuré 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 función 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.

+0

OK, bastante avergonzado, pero hay una "base".ShowDialog() "y funciona bien. Estaba intentando" this.base.ShowDialog() ". Esto funciona perfectamente. –

Respuesta

10

Editar: Proberly no es una buena idea para 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, todavía se permite que ShowDialog() se use 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; 
} 

continuación, puede utilizar esta

MyFormsResult result = MyForm.DoShowGetResult(); 
0

El método ShowDialog no puede ser anulado 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; 
} 
1

No, no es posible. La solución habitual es exponer el resultado real como una propiedad en el formulario:

pubic MyFormResults MyResult 
{ 
    get; 
} 

y se fijaría 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 es el siguiente:

if (form.ShowDialog == DialogResult.OK) 
{ 
    //do something with form.MyResult 
} 
3

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