Wie implementiert man am besten, dass ein Formular einen Rückgabewert liefert. In der Praxis hat sich am besten folgender Weg behauptet. Man statte das neue Formular mit einem Public ReadOnlyProperty aus, den man nach Schließen des Formulars abfragt. In den meisten Fällen ist gewünscht, dass das Formular, das einen Rückgabewert liefern soll, während der Eingabe im Vordergrund bleibt und die anderen Fenster blockiert. Daher wird das Formular mittels ShowDialog aufgerufen. 

Aufruf des Formulars, das einen Rückgabewert liefern soll, mittels ShowDialog

Formular2.ShowDialog()

Im Formular2, dass einen Rückgabewert liefern soll, benötigen wir eine Private Variable, in der der Rückgabewert gespeichert werden soll und ein Public ReadOnly Property, dass man abfragen kann.

Erläuterung des Codes:

  • Private _myVar As String = String.Empty: Hier wird eine private Variable _myVar deklariert und mit einem leeren String initialisiert.
  • Private Sub cmd_save_Click(...) Handles cmd_save.Click: Dies ist ein Ereignishandler für den Klick auf einen Button namens cmd_save. Wenn der Button geklickt wird, wird der Text aus einem Textfeld txt_Eingabe der Variablen _myVar zugewiesen.
  • Public ReadOnly Property myVar As String: Dies ist eine schreibgeschützte öffentliche Eigenschaft, die den Zugriff auf den Wert der privaten Variable _myVar ermöglicht. Der Fehler im ursprünglichen Code bestand darin, dass innerhalb des Get-Zugriffors Return Me.myVar anstelle von Return Me._myVar verwendet wurde, was zu einem StackOverflow-Fehler führen würde.

Jetzt würde sich in diesem Public ReadOnlyProperty der Wert des Rückgabewertes (im konkreten Fall der Inhalt von Form2.txt_Eingabe) befinden, dem man lediglich vom Hauptformular abfragen muss. 

Formular1 - Aufruf Formular2 + Wertabfrage

Und nun hat man in der UebergaveVar den Wert des Rückgabewertes. Dies geht natürlich auch mit mehreren Variablen, und mit Variablen, die man an das Formular übergibt … 

Problematischer ist die Sache, wenn man das Formular nicht mit ShowDialog sondern mit Show anzeigt. Dadurch werden die anderen Fenster nicht blockiert und die Übergebene Variable bleibt leer, da der Code des Formulars 1 einfach weiterläuft und zu Beginn – also nach dem Formularaufruf von Formular2 das Public ReadOnly Property noch leer ist. Dem kann man jedoch entgegenwirken, indem man sich beispielsweise einen Timer bastelt, davon würde ich persönlich jedoch abraten.