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.

¿Fue útil?

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

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top