Domanda

EDIT: questo metodo funziona in realtà grande e ho chiesto poi trovato la soluzione successiva. Ho aggiunto la chiamata corretta nella ShowDialog overload () il metodo (non è exacly un sovraccarico, o addirittura una sostituzione, ma funziona lo stesso. La mia nuova domanda è quella in basso.

Ho una forma in cui si fa clic su uno dei tre pulsanti. Ho definito un enum per i risultati restituiti. Voglio fare la chiamata:

MyFormResults res = MyForm.ShowDialog();

posso aggiungere un nuovo metodo ShowDialog con questo codice:

public new MyFormResults ShowDialog()
{
    //Show modal dialog
    base.ShowDialog(); //This works and somehow I missed this

    return  myResult; //Form level variable (read on)
}

Ho impostato una variabile a livello di modulo per il risultato quando i pulsanti vengono cliccati:

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

L'unica cosa che mi manca è il codice per visualizzare la finestra (modale) e poi tornare il mio risultato. Non esiste una funzione base.ShowDialog(), così come faccio a fare questo?

EDIT: C'è un 'base.ShowDialog ()' e funziona. Questa è la mia nuova domanda qui:

Inoltre, è questo il modo migliore per fare tutto questo e perché?

Grazie.

È stato utile?

Soluzione

Edit: Non è proberly una buona idea di modificare la funzionalità di ShowDialog(), la gente si aspetta che ritorni un DialogResult e mostrare il modulo, vi suggerisco di qualcosa come il mio suggerimento di seguito. Così, ancora permettendo ShowDialog() da utilizzare secondo le normali procedure.

Si potrebbe creare un metodo statico sul MyForm, qualcosa di simile DoShowGetResult()

che sarebbe simile a questa

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

, allora è possibile utilizzare questo

MyFormsResult result = MyForm.DoShowGetResult();

Altri suggerimenti

Prova questo, sembra funzionare per me:

 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, non è possibile. La soluzione usuale è quello di esporre il vero risultato come una proprietà nel Modulo:

public MyFormResults MyResult
{
    get;
}

e si sarebbe poi impostare questo:

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?
}

e il codice chiamante di solito è questo:

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

Il metodo ShowDialog non può essere ignorato. Che cosa si potrebbe fare se intead è creare un nuovo metodo che restituisce sia il risultato ShowDialog e un altro valore.

public ShowDialogResult ShowDialogWrappe(out MyFormResults result) { 
  var dialogRet = ShowDialog();
  result = MyFormResults.Result1;
  return dialogRet;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top