E 'possibile sovraccaricare il metodo ShowDialog per le forme e restituire un risultato diverso?
-
04-10-2019 - |
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.
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 ??p>
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;
}