Ist es möglich, die Showdialog-Methode für Formulare zu überlasten und ein anderes Ergebnis zurückgeben?

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

Frage

EDIT: Diese Methode tatsächlich funktioniert gut und ich fragte sie dann die Lösung später gefunden. Ich habe den richtigen Anruf in dem überladenen Showdialog () -Methode (es ist nicht exacly eine Überlastung oder sogar eine Überschreibung, aber es funktioniert genauso. Meine neue Frage die man am Boden ist.

habe ich ein Formular, in dem Sie einen von drei Schaltflächen klicken. Ich habe eine Enumeration für die zurückgegebenen Ergebnisse definiert. Ich mag den Anruf machen:

MyFormResults res = MyForm.ShowDialog();

Ich kann eine neue Methode Showdialog mit diesem Code hinzufügen:

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

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

Ich habe eine Formularebene Variable für das Ergebnis, wenn die Tasten angeklickt werden:

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

Das einzige, was ich vermisst habe, ist der Code den Dialog (modal) zu zeigen, und dann mein Ergebnis zurück. Es gibt keine base.ShowDialog() Funktion, so wie kann ich das tun?

EDIT: Es gibt ein 'base.ShowDialog ()' und es funktioniert. Das ist meine neue Frage hier:

Auch ist dies der beste Weg, das alles und warum?

zu tun

Danke.

War es hilfreich?

Lösung

Edit: Es ist proberly keine gute Idee, um die Funktionalität von ShowDialog() zu ändern, die Menschen erwarten, dass es eine DialogResult zurückzukehren und die Form zu zeigen, schlage ich vor, so etwas wie mein Vorschlag unten. So noch ShowDialog() so dass die normale Art und Weise verwendet werden.

Sie können eine statische Methode auf Ihrem MyForm erstellen, so etwas wie DoShowGetResult()

, die in etwa so aussehen würde

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

, dann können Sie diese verwenden

MyFormsResult result = MyForm.DoShowGetResult();

Andere Tipps

Versuchen Sie dies, so scheint es, für mich zu arbeiten:

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

Nein, es ist nicht möglich. Die übliche Abhilfe ist Ihr eigentliches Ergebnis als eine Eigenschaft auf dem Formular zu entlarven:

public MyFormResults MyResult
{
    get;
}

, und Sie würden dann setzen Sie diese:

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

und der anruf Code sieht in der Regel wie folgt aus:

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

Die ShowDialog Methode kann nicht überschriebenen. Was könnten Sie intead obwohl tun, ist eine neue Methode erstellen, die Renditen sowohl die Showdialog Ergebnis und einen anderen Wert.

public ShowDialogResult ShowDialogWrappe(out MyFormResults result) { 
  var dialogRet = ShowDialog();
  result = MyFormResults.Result1;
  return dialogRet;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top