Zu einer Form springen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von frifri.

    Zu einer Form springen

    Hallo Ich habe in meinem Programm mehrere Formen. Jetzt geht es nur um drei von denen.
    Die Hauptform ist Form1
    dann gibt es noch Form2 und Form3.

    Ich rufe Form2 auf von dort kann ich auch die Form3 aufrufen. Die Form sind immer vollbild

    VB.NET-Quellcode

    1. Me.WindowState = System.Windows.Forms.FormWindowState.Maximized


    Wenn ich in Form3 die Bearbeitungen abgeschlossen habe und ich klicke den Button Schließen, soll das Programm wieder zur Form1 zurückkehren und dabei natürlich auch die Form2 schließen.
    Wenn ich den Button Zurück klicke soll nur Form3 geschlossen werden, es geht zur Form2 zurück ohne zurück auf Form1 zu gehen.

    ich öffne die Form2 mit

    VB.NET-Quellcode

    1. Dim dlgFormMenue As New Form1
    2. dlgFormMenue.ShowDialog(Me)


    um Form2 zu schließen müsste ich ja deren Name wissen, wie bekomme ich den raus oder macht man das nicht so?
    @frifri Wenn Du mit nicht modalern Dialogen arbeitest,
    Aboniere in Form2 das FormClosing-Event der Form3.

    VB.NET-Quellcode

    1. AddHandler dlg3.FormClosing, AddressOf(DEINE_PROZEDUR)
    Dort kannst Du dann tun, was zu tun ist.
    ============
    Wenn Du mit modalen Dialogen arbeitest, musst Du nach dem .ShowDialog() einfach Me.Close() aufrufen und der 2. Dialog wird geschlossen.
    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!
    Dann wird die Form2 aber doch immer geschlossen auch wenn ich nicht nach Form1 zurück will sondern noch was in Form2 machen will.
    ich hab mir da jetzt immer mit einer Variablen beim Aufruf der Form3 geholfen
    dlgFormMenue.Direkt_zurück = True

    in Form3 wird die Variable dann abgeändert zu False wenn ich zurück zu Form2 will und zu True wenn ich zurück zu Form1 will.
    das funktioniert auch aber sieht mir nicht recht elegant aus. :)



    Dabei fällt mir auch noch ein weiteres Problem ein das jetzt hier noch nicht von Belang ist.
    Was ist wenn ich aus einem Programm heraus eine Form(z.B.Form4) in den Vordergrund bringen will, dann müsste ich von dieser Form ja auch den Namen wissen.Wie bekomme ich denn den Namen der Form raus.
    mit Form4.BringToFront oder Form4.WindowState = FormWindowState.Normal wird das ja nix, weil die Form ja nicht Form4 heißt.

    frifri schrieb:

    dann müsste ich von dieser Form ja auch den Namen wissen.
    Nö.
    Du musst deren Instanz kennen. Und wie Du registrierst, dass eine Form geschlossen wird, hab ich Dir oben gezeigt. Das musst Du machen.
    Zu einer Parent-Form springen, ohne dass das Child geschlossen wird, geht nur bei nicht modalen Dialogen.
    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!
    Erstmal mit Form2 und Form3 wäre mein Vorschlag:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Dim Dlg As Form3 = Nothing
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dlg = New Form3
    5. AddHandler Dlg.CloseYouAndMe, AddressOf CloseMeAndForm3
    6. Dlg.ShowDialog(Me)
    7. Dlg = Nothing
    8. End Sub
    9. Private Sub CloseMeAndForm3()
    10. Dlg.Dispose()
    11. Dlg = Nothing
    12. Me.Close()
    13. End Sub
    14. End Class
    15. 'Und in Form3:
    16. Public Event CloseYouAndMe()
    17. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    18. RaiseEvent CloseYouAndMe()
    19. End Sub

    ...sodass das Subform dem Parent-Form eben nur ggf. bescheid sagt: "schließ mich und Dich"
    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.
    @VaporiZed WHAT :?:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Using dlg = New Form3
    4. dlg.ShowDialog()
    5. End Using
    6. Me.Close()
    7. End Sub
    8. End Class

    VB.NET-Quellcode

    1. Public Class Form3
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Me.Close()
    4. End Sub
    5. End Class
    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!
    Aber der TE will doch entweder, dass sich nur Form3 schließt oder dass man über eine Form3-Funktion Form3 und Form2 (welches Form3 erzeugt hat) schließt. Wie in Post#3 zu lesen schließt Dein Vorschlag aber immer Form3 und Form2.
    Ok, mein Vorschlag ist genau andersrum: Das Schließen über [X] schließt Form3 und über den Button Form2 und Form3, aber das ist ja leicht zu tauschen.
    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.
    @VaporiZed OK.
    @frifri Male mal eine Skizze, wie sich die Forman aufrufen und wie sie beim Schließen einer zu einer anderen springen sollen.
    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!
    Form1 ist bei mir das Hauptprogramm
    in dieser Form habe ich einen Button "Menue"
    klicke ich den an öffnet sich Form2

    In Form2 habe ich mehrere Buttons.
    Button Adressen öffnet Form3
    Button Passwort öffnet Form4
    Button Stammdaten öffnet Form5
    usw.

    wenn ich jetzt in Form3 die Adresse geändert habe, kann es sein dass ich noch das Passwort oder die Stammdaten ändern möchte. Dann soll der "zurück Button" in Form3 mich eine Ebene höher bringen. Also Form3 schließen und zurück zu Form2.
    Wenn ich aber mit den Änderungen fertig bin, dann soll mich der "Button ENDE" zurück ins Hauptprogramm bringen. Also Form3 und Form2 schließen und zurück zu Form1.

    Darum wäre ein Me.Close und ein InstanzName.Form2.Close die einfachste Möglichkeit. Denke ich.


    Die Möglichkeit von VaporiZ muss ich erst durcharbeiten, bin ich noch nicht zu gekommen.

    RodFromGermany schrieb:

    Male mal eine Skizze
    ein Versuch war's wert :/
    Mir ist noch was in den Unsinn gekommen. Statt Events geht's hiermit einfacher:

    VB.NET-Quellcode

    1. Public Class Form3
    2. Private _CloseParent As Boolean = False
    3. Public Property CloseParent As Boolean
    4. Get
    5. Return _CloseParent
    6. End Get
    7. Private Set(value As Boolean)
    8. _CloseParent = value
    9. End Set
    10. End Property
    11. Private Sub BtnEnd_Click(sender As Object, e As EventArgs) Handles BtnEnd.Click
    12. _CloseParent = True
    13. Me.Close()
    14. End Sub
    15. Private Sub BtnBack_Click(sender As Object, e As EventArgs) Handles BtnBack.Click
    16. Me.Close()
    17. End Sub
    18. End Class
    19. 'Form2:
    20. Private Sub BtnCreateAndShowForm3_Click(sender As Object, e As EventArgs) Handles BtnCreateAndShowForm3.Click
    21. Using Dlg As New Form3
    22. Dlg.ShowDialog(Me)
    23. If Dlg.CloseParent Then Me.Close()
    24. End Using
    25. End Sub

    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.
    @VaporiZed Jou.
    Inzwischen genügt dies:

    VB.NET-Quellcode

    1. Public Property CloseParent As Boolean

    @frifri Mit Skizze meinte ich, dass Du grafisch darstellst, welche Form bei Drücken eines Close-Buttons dargestellt wird, also ein Pfeil zu einer übergeordneten Form.
    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!
    Nicht ganz, da ich den Setter Private gemacht habe, damit nur Form3 die Property ändern kann, aber das ist ja nur ein Detail.
    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.

    VaporiZed schrieb:

    Detail
    OK, erwischt. :D
    Ich arbeite mit C#, da stünde

    C#-Quellcode

    1. public bool CloseParent { get; private set; }

    @frifri Wir warten auf Deine Skizze.
    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!
    Indem Du statt auf [+ Antworten] auf [+ Erweiterte Antwort] klickst. Da kannst Du Bilder und andere Dateien hochladen.
    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.
    Na, ist denn das Problem noch nicht gelöst?

    Ich glaub übrigens fast, dass ich das Problem auch ohne Bildle verstanden hab:
    Form1 öffnet Form2, Form2 öffnet Form3
    In Form3 solls nun neben dem normalen Schliessen-Button auch einen geben, der Form2 gleich mit-schließt.

    Aber Bildle anhängen lernen ist immer nicht verkehrt
    gugge auch

    ErfinderDesRades schrieb:


    Ich glaub übrigens fast, dass ich das Problem auch ohne Bildle verstanden hab:
    Form1 öffnet Form2, Form2 öffnet Form3
    In Form3 solls nun neben dem normalen Schliessen-Button auch einen geben, der Form2 gleich mit-schließt.

    genau das und danke für das Video


    für erweiterte Anwendung hab ich keine Berechtigung und Datei anhänge hochladen, wie im Video beschrieben, gibt es bei mir nicht und bei Bild will er eine URL, das Bild liegt aber bei mir und nicht im Netz

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „frifri“ ()

    frifri schrieb:

    für erweiterte Anwendung hab ich keine Berechtigung
    Du musst auf den Button Erweiterte Antwort klicken:

    und dann
    => Dateianhänge => Hochladen
    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!

    Neu

    Es scheint also nicht zu gehen, dass ich den Namen der Instanz herausbekomme, habe ich mich dann also doch entschlossen es so zu lassen wie ich es schon hatte.

    in Form2 übergebe ich eine Variable mit:

    VB.NET-Quellcode

    1. dlgFrmForm3.backToForm1 = BackToKasse


    in Form3
    Property backToForm1 As Boolean

    klick ich auf den zurück Button wird die Variable mit

    VB.NET-Quellcode

    1. backToForm1 = FALSE


    klick ich auf den Button zurück zu Form1

    VB.NET-Quellcode

    1. backToForm1 = TRUE


    und in Form2 werte ich die Variable aus, auf weiterlaufen in Form2 oder nochmals Me.Close in Form2

    danke für die Hilfe