Est-il possible de surcharger la méthode ShowDialog pour les formulaires et retourner un résultat différent?

StackOverflow https://stackoverflow.com/questions/3764736

Question

EDIT: Cette méthode fonctionne réellement grand et je l'ai demandé trouvé puis plus tard la solution. J'ai ajouté l'appel correct dans la méthode ShowDialog () surcharge (ce n'est pas exacly une surcharge, ou même un remplacement, mais cela fonctionne tout de même. Ma nouvelle question est celle en bas.

J'ai une forme dans laquelle vous cliquez sur l'un des trois boutons. J'ai défini un ENUM pour les résultats retournés. Je veux faire l'appel:

MyFormResults res = MyForm.ShowDialog();

Je peux ajouter une nouvelle méthode ShowDialog avec ce code:

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

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

I définir une variable au niveau de la forme pour le résultat lorsque les boutons sont cliqués:

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

La seule chose que je manque le code pour afficher la boîte de dialogue (modal), puis retourner mon résultat. Il n'y a pas de fonction base.ShowDialog(), alors comment puis-je faire?

EDIT: Il y a un 'base.ShowDialog ()' et cela fonctionne. Ceci est ma nouvelle question ici:

Aussi, est-ce la meilleure façon de faire tout cela et pourquoi?

Merci.

Était-ce utile?

La solution

Edit: Il est proberly pas une bonne idée de changer la fonctionnalité de ShowDialog(), les gens attendent de retourner un DialogResult et montrer la forme, je suggère quelque chose comme ma suggestion ci-dessous. Ainsi, ce qui permet encore ShowDialog() à utiliser la manière normale.

Vous pouvez créer une méthode statique sur votre MyForm, quelque chose comme DoShowGetResult()

qui ressemblerait à quelque chose comme ceci

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

vous pouvez alors utiliser cette

MyFormsResult result = MyForm.DoShowGetResult();

Autres conseils

Essayez cela, il semble fonctionner pour moi:

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

Non, il est impossible. La solution habituelle est d'exposer le résultat réel comme une propriété sur le formulaire:

public MyFormResults MyResult
{
    get;
}

et que vous souhaitez ensuite définir ceci:

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

et le code appelant ressemble généralement à ceci:

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

La méthode ShowDialog ne peut pas être surchargée. Ce que vous pouvez faire est intead bien créer une nouvelle méthode qui retourne à la fois le résultat ShowDialog et une autre valeur.

public ShowDialogResult ShowDialogWrappe(out MyFormResults result) { 
  var dialogRet = ShowDialog();
  result = MyFormResults.Result1;
  return dialogRet;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top