Kommunikation zwischen 2 Formularen

    • VB.NET

    Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      Kommunikation zwischen 2 Formularen

      Edit by ErfinderDesRades: (Thema verschoben) ich dachte, ich schieb das erstmal in den SourceCode-Austausch, weil einige wichtige Gesichtspunkte zum Thema sind glaub noch nicht abgedeckt

      Dieses Tutorial richtet sich an fortgeschrittene Anfänger, die die Grundbegriffe der objektorientierten Programmierung beherrschen.

      In diesem Tutorial geht es darum, wie Daten zwischen einem ParentForm(Hauptfenster) und einem ChildForm(Unterfenster) in beide Richtungen ausgetaucht werden können.

      ParentForm -> ChildForm
      Wenn Daten von einem Hauptfenster an ein Unterfenster weitergeleitet werden sollen, dann kann man den Konstruktor im Unterfenster anpassen bzw. den Standardkonstruktor ersetzten. Dem Konstruktor muss ein Parameter übergeben werden. In meinem Beispiel ist das der Parameter text vom Typ String. Der Text wird dann in einer TextBox, die auf dem ChildForm ist, angezeigt.

      Code in der ChildForm.vb:

      VB.NET-Quellcode

      1. Public Sub New(ByVal text As String)
      2. ' Dieser Aufruf ist für den Designer erforderlich.
      3. InitializeComponent()
      4. txt_text.Text = text
      5. End Sub


      ChildForm -> ParentForm
      Im Internet findet man die verschiedensten Möglichkeiten für diese Aufgabe. Ich habe mich hier für die einfachste und meiner Meinung nach sinnvollste Variante entschieden. Die Problematik dabei ist, dass die Daten an die richtige Instanz des Forms geschickt werden müssen.

      VB.NET-Quellcode

      1. Dim parentform As ParentForm = New ParentForm(txt_text.Text)
      2. parentform.Show()


      Dieser Code würde funktionieren, allerdings öffnet dieser Code jedesmal eine neue ParentForm. Die Daten, die eventuell schon in einer anderen Instanz der ParentForm sichtbar waren, werden nicht angezeigt.

      VB.NET-Quellcode

      1. Dim parentform As ParentForm = TryCast(Application.OpenForms("ParentForm"), ParentForm)


      In dieser Codezeile wird die richtige Instanz des ParentForm(das geöffnete ParentForm) in die Variable parentform geschrieben. Nun kann auf das ParentForm zugegriffen werden.

      VB.NET-Quellcode

      1. parentform.lbl_text.Text = txt_text.Text




      Ich hoffe, dass ich helfen konnte. Zur besseren Verständlichkeit hänge ich noch mein Beispiel an.
      Dateien

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Grasdackel1996“ ()

      Definiere Parent-/Child-Form.
      Nach meinem Verständnis nämlich enthält das ParentForm ein Objekt vom Typ ChildForm, und kann es anzeigen.
      Ein ChildForm, was das ParentForm öffnet, kanns nach meinem Verständnis gar nicht geben, denn dann wäre es ja das ParentForm.

      Auch dass Daten dem ChildForm über den Konstruktor gegeben werden müssen ist nicht richtig. Das ist allenfalls eine von mehreren Möglichkeiten.
      @Grasdackel1996:: Es wäre fein, wenn Dein Zip-File nicht nur den SLN-File, sondern auch die Quellen enthalten würde.
      Ansonsten: Gugst Du hier.

      RodFromGermany schrieb:

      1. Wir wollen vom 2. Dialog aus ein Event zur MainForm senden.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      @ErfinderDesRades:

      ParentForm: Das Formular, welches ein Objekt vom Typ ChildForm enthält. Von dem ParentForm wird die ChildForm aufgerufen.
      ChildForm: Das Formular, welches von ParentForm aufgerufen werden kann. ChildForm kann ParentForm natürlich nicht aufrufen.

      Das die Daten nicht über den Konstruktor angegeben werden müssen ist mir natürlich schon klar, ich habe dieses Tutorial auch für Anfänger in der objektorientierung geschrieben. Was meinst du damit, dass ich wichtige Teile in diesem Thema weggelassen habe? In dem Tutorial geht es nur darum, eine Möglichkeit aufzuzeigen, wie Daten zwischen Formularen übertragen werden können.

      @RodFromGermany:

      Was meinst du mit Quellen? Ich habe dieses Tutorial aus meinem Wissen verfasst. Von meinem Beispielprojekt habe ich nur noch die .sln-Datei.

      Grasdackel1996 schrieb:

      ChildForm kann ParentForm natürlich nicht aufrufen.
      Aber im Abschnitt ChildForm->ParentForm machst du das andauernd.
      Du bietest sogar gar keine Alternative dazu an, etwa was Rod anspricht, dass das ChildForm ein Event versenden könnte/sollte.
      guggemol auch VeryBasics

      Eine Alternative zur Daten-Injektion per Konstruktor wäre auch einfach eine Public Property im ChildForm.

      Und eine weitere Child->Parent - Kommunikationsform besteht auch darin, zunächstmal den Rückgabewert von ChildForm.ShowDialog() auszuwerten.
      @ErfinderDesRades:

      Mit "aufrufen" meine ich instanziern. Das geschieht im 2. Abschnitt nur im 1. Codeausschnitt, um den Fehler zu zeigen.

      VB.NET-Quellcode

      1. Dim parentform As ParentForm = TryCast(Application.OpenForms("ParentForm"), ParentForm)

      Diese Variableninstanzierung schreibt in die Variable parentform die bereits offene Instanz der ParentForm. Dannach kann auf diese Instanz zugegriffen werden und der Text geändert werden.

      Wie schon vorhin erwähnt: Es geht mir in diesem Tutorial nur darum, eine von vielen Möglichkeiten aufzuzeigen. Ich habe mich für die für Anfänger am einfachste Variante entschieden.

      Grasdackel1996 schrieb:

      Von meinem Beispielprojekt habe ich nur noch die .sln-Datei.
      Das ist ein hohler Vogel, was soll ein Tutorial ohne Quellen?
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      Was hat das Beispiel mit

      Grasdackel1996 schrieb:

      Kommunikation zwischen 2 Formularen
      zu tun?
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      Naja was er meint ist halt. Er hat ein Formular mit einem Label z.B. Er öffnet ein weiteres Fenster, indem man das Label ändern kann. Dann tippt man den Text in das Textfeld drückt ändern und schwups wird im "Elterformular" der Label Text geändert. Dabei übergibt er im Konstruktur des Childfensters das Elternformular.

      VB.NET-Quellcode

      1. Public Class Parent as Form
      2. Public _label as Label = new Label()
      3. '....
      4. End Class
      5. Public Class Child as Form
      6. Private _p as Parent
      7. Public Sub New(parent as Parent)
      8. Me._p = parent
      9. End Sub
      10. End Class

      Sio_x schrieb:

      Naja was er meint ist halt
      sehr unklar. Immer noch.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!