Kein Zugriff von Form2 auf Form1

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Akanel.

    Kein Zugriff von Form2 auf Form1

    Hallo.

    Ich hab wieder mal ein Problem ?(

    Das Kernproblem.
    ​In Form1 ist dieser Code:

    VB.NET-Quellcode

    1. ​Public bl as Boolean = True
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Form2.ShowDialog()
    4. End Sub


    Im Load-Event der Form2:

    VB.NET-Quellcode

    1. ​Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. If Form1.bl = True Then Label1.text = "True"
    3. End Sub


    ​Welche Ursache könnte es haben das ich IMMER FALSE bekomme?

    LG
    Weil du die Form nicht klassenweit instanzierst bastelt VB einfach jedes mal ne neue instanz die nichts mit dem zu tun hast was dir angezeigt wird.
    Wichtiges Thema das mit dem Instanzieren und der kommunikation zwischen 2 Forms. Gibts nen tolles Tutorial hier im Forum dazu.
    Edit: Tutorial: Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich komme Rod zuvor und verweise gleich mal auf seinen passenden Thread zum korrekten Instanziieren von Formularen und Dialogen.
    Warum? Deshalb: Warum »Form1.Show« und Co. einem irgendwann ins Bein schießen
    btw: auch wenn der von Dir gezeigte Code no-go-Code ist, läuft er bei mir.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Wenn ich ein neues Projekt aufmache und den Code aus dem Beispiel oben so eingebe funktioniert das auch. In meinem HauptProjekt läuft das nicht.

    ​Den Thread von Rod kenne ich. Hab es mir zich mal angeschaut und probiert. Es löst einfach nicht mein Problem.

    ​Kannst du mir bitte anhand meines Codes ( NO-GO-CODE ) einen GO-CODE Posten?? :)
    So ungefähr vielleicht....

    VB.NET-Quellcode

    1. 'Form1
    2. Dim bl as Boolean = True
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim f as New Form2(bl)
    5. f.ShowDialog
    6. End Sub
    7. 'In Form2
    8. Dim b2 as Booolean
    9. Sub New (b as Boolean)
    10. b2 = b
    11. end Sub
    12. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    13. If b2 Then Label1.text = "True"
    14. End Sub
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    DragsTrail schrieb:

    In meinem HauptProjekt läuft das nicht.
    Weil Du mit Threads oder allgemein Nebenläufigkeit arbeitest? Denn ich versteh gerade den Sinn des Themas hier nicht, wenn Du Code postest, der angeblich nicht funktioniert, tatsächlich aber doch funktioniert und wir in Wirklichkeit über etwas anderes reden sollten. Aber sei's drum. mrMo hat ja schon gezeigt, wie es (besser) geht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Was meinst Du? Dass Du nicht mit Nebenläufigkeit arbeitest oder dass mrMos Code nicht bei Dir läuft?
    Nun, dazu 2 Kleinigkeiten: in seiner Zeile#10 ist bei Boolean ein "o" zuviel und nach Zeile#11 muss stehen: InitializeComponent()
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Lies endlich mal den RFG-Thread, und kapiere, dass du Form1 einfach überhaupt nicht aufrufen sollst!
    Form1 ist ein Datentyp - das kann man nicht aufrufen!

    in deim Code in Zeile #1 erstellst du schön ein Form1-Objekt, mit dem Schlüsselwort New - und dann benutzte es garnet, sondern rufst nachwievor dieses blöde Form1 auf!
    statt den newMDIChild.
    @ErfinderDesRades

    Der Code ist ein totaler Blödsinn. Hab ich von Hand rein geschrieben. Ich probiere jetzt schon 4 Stunden lang.

    Natürlich rufe ich das newMDIChild auf.

    VB.NET-Quellcode

    1. Dim newMDIChild As Form1 = New Form1()
    2. newMDIChild.MdiParent = MainForm
    3. newMDIChild.Show()


    ​Und genau da liegt das Problem.

    ​Wenn ich die Form1 wie folgt aufrufe ( sollst du nicht machen anscheinend, verstehe immer noch nicht warum :(

    VB.NET-Quellcode

    1. Form1.ShowDialog()


    ​dann kann ich aus der Form1 alles rauslesen. Ich brauch die Form1 aber als Child und will trotzdem von dieser alles rauslesen was ich brauche und aus form2 muss ich noch Controls in Form1 einfügen können.
    1. Werd mal etwas konkreter, vielleicht mit passender Namensgebung. Form1, Form2, Button1. Das ist ziemlich nichtssagend. Form1 ist also ein ChildForm von Mainform. Woher kommt jetzt plötzlich Form2? Von welchem Typ ist Form2? Soll es ein MdiChild von Mainform werden? Oder gar von Form1?
    2. Es sei gegeben: das Hauptformular namens Mainform, eingestellt als MdiContainer. Darin enthalten folgender Code:

    VB.NET-Quellcode

    1. Private b As Boolean = True
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim newMDIChild = New Form2()
    4. newMDIChild.MdiParent = Me
    5. newMDIChild.InitWith(b)
    6. newMDIChild.Show()
    7. End Sub

    Und in Form2, der ChildFormKlasse:

    VB.NET-Quellcode

    1. Public Sub InitWith(b As Boolean)
    2. If b Then Button1.Text = "True"
    3. End Sub

    Habe ich erfolgreich getestet. Was passt nun noch nicht?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    DragsTrail schrieb:

    ​Wenn ich die Form1 wie folgt aufrufe ( sollst du nicht machen anscheinend, verstehe immer noch nicht warum
    Dassis das eigliche Problem. Du weisst nicht, was ein Datentyp ist im Unterschied zu einem Objekt dieses Datentyps.
    Ich weiss leider nicht, wie ichs dir erklären soll, weil vb.net sowas idiotischerweise eben doch zulässt:

    VB.NET-Quellcode

    1. Form1.Show()
    Aber es lässt es nur für TopLevel-Forms zu, nicht für MDIChildren.

    Jedenfalls, weil du dran gewöhnt bist, dass Form1.Show geht, kannst du nicht kapieren, dass Form1 ein Datentyp ist, und kein Objekt.
    Und probierst immer weiter und weiter und weiter, was eben numal nicht geht.

    Ich werd mir den Thread merken - er demonstriert wunderbar, wie verheerend dieses idiotische vb.net-Feature ist, für Forms (nur für TopLevel-Forms!) eine unsichtbare Default-Property zu generieren.
    Wahrhaft Gehirn-zersetzend.

    Dein Problem konkret ist, dass diese idiotische DefaultProperty eben nur für TopLevel-Forms funktioniert, nicht aber für MDIChildren.
    Und das geht dir nicht in' Kopp, weil hat ja immer funktioniert (und war schon immer sch...) - wie gesagt: solange du von Form1.Show nicht lassen kannst, wirst du nicht weiterkommen.
    3 Leute weisen dich @DragsTrail auf den gleichen Thread hin. Jetzt pausiere mal das Thema und arbeite den Thread durch und verstehe was da warum gemacht wird. Ohne dieses Wissen wirst du immer wieder an solche Hürden wie jetzt stoßen. Zudem ist der Unterschied zwischen Datentyp und Objekt wichtig.

    Datentyp = Auto
    Objekt = dein jetziges Auto
    Solltest du kein Auto besitzen, ist das Objekt übrigens Nothing...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @ErfinderDesRades
    Ist angekommen.
    ​Aber es lässt es nur für TopLevel-Forms zu, nicht für MDIChildren.

    Das ist genau die Antwort die ich gesucht haben. Jetzt brauchen wir eine Code-Lösung. :)

    @VaporiZed

    Danke. Hab das jetzt verstanden und probiert und es funktioniert. Wie läuft das jetzt umgekehrt?

    Ich soll konkreter werden. OK.

    Beispiel
    =======

    Form1 ==> MDIParent
    Form2 ==> Child
    Form3 ==> Child

    Form3 wird von Form2 aufgerufen.

    1. Wie kann ich aus Form3 in Form2 Werte verändern? z.B. SelectedIndex einer ComboBox in Form2
    2. Wie kann ich aus Form3 in Form2 neue Controls einfügen? z.B. Ein Panel mit einem Button in Form2
    Ein untergeordnetes Form(ular) kann seinem ParentForm m.E. nur auf einem vernünftigen Weg etwas mitteilen, da es selbst keinen Einfluss auf seinen Parent hat*: Mit Events. D.h., dass im jeweiligen ChildForm ein eigenes Event erstellt wird, dieses nach Erstellung des ChildForms im ParentForm mit einer Sub im ParentForm verbunden wird und im Bedarfsfall das ChildForm das Event auslöst. Das bekommt dann das ParentForm mit und kann dann ggf. darauf reagieren, z.B. durch Veränderung eigener CEs.

    * wir lassen mal das Parent-Casten weg
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Antwort von @VaporiZed in Kombination mit
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Sollten eine Lösung herbei führen können. Man müsste sich mit dem Thema halt beschäftigen...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    DragsTrail schrieb:

    2. Wie kann ich aus Form3 in Form2 neue Controls einfügen? z.B. Ein Panel mit einem Button in Form2
    Ist mit dieser Formulierung ein NoGo.
    Die übergeordnete Form (Form1) ruft die untergeordnete Form auf, denn sie hält die Instanz.
    Eine untergeordnete Form sendet an die übergeordnete Form ein Event, sofern diese es aboniert hat.
    Zwei parallele Formen (Form2 und Form3) sollten nix voneinander wissen, denn sie könnten sowohl einzeln als auch beide visible sein.
    In diesem Falle würde ich von Form3 ein Event an Form1 senden, worauf hin von dort mit Form2 iwas gemacht wird.
    So lässt sich immer abfangen, wenn eine Form nicht instanziiert ist.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    ​....wissen, denn sie könnten sowohl einzeln als auch beide visible sein.


    Das Child Form2 und Child Form3 können immer nur 1-mal aufgerufen werden. Das überwache ich.

    Wie immer äußerst du dich sehr genau. Im Kern habe ich das schon verstanden. Dein Thread habe ich Stück für Stück abgearbeitet in einem neuen Projekt.
    Soweit war alles gut. Die Theorie steht.

    Also konkretes Beispiel. Child2 soll an das Parent ein Panel, ein Button, ein Label, ein Combobox.selectedIndex übergeben. Parent soll das jetzt in Child1 umsetzen.

    Ich hab keine Ahnung wie ich das coden soll. Für einen Code von diesem Beispiel wehre ich echt sehr dankbar.
    In Child2 baust du ein Event ein, welches vom Parent abonniert wird. Über dieses Event übermittelst du deine Werte/Controls. Die Methode welche im Parent das event „empfängt“ verarbeitet diese dann.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen