.FormClosing Ereignis nur in Verbindung mit vorherigem .Show

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von roepke.

    .FormClosing Ereignis nur in Verbindung mit vorherigem .Show

    Hallo zusammen,
    habe ich was überlesen oder wo finde die Infos darüber, dass das .FormClosing Event nur gefeuert wird, wenn ich vorher ein .Show aufgerufen habe?
    Konkret

    VB.NET-Quellcode

    1. Private Sub btn_OpenClose_Click(sender As Object, e As EventArgs) Handles btn_OpenClose.Click
    2. Dim a = New Form2
    3. a.WindowState = FormWindowState.Minimized
    4. a.ShowInTaskbar = False
    5. a.Show()
    6. a.Close()
    7. End Sub

    Ich will Form2 im Hintergrund, unsichtbar ausführen, also habe ich .Show() weggelassen mit dem Ergebnis, dass Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing nicht ausgeführt wird.
    Nachdem ich mich eine halbe Stunde im Kreis gedreht habe, habe ich verstanden, dass ich .Show brauche. Warum, wo steht das geschrieben?
    Ich helfe mir jetzt mit FormWindowState.Minimized und a.ShowInTaskbar.
    Hallo @roepke

    Das sieht mir ein bisschen komisch aus, was du hier ausprobierst. In obingen Code wird das Form normalerweise nachdem die Methode durchlaufen wird geöffnet. In Zeile 6 schliesst du sie aber wieder. Das kann also nicht funktionieren.

    Vielleicht erklärst du noch ein bisschen genauer was schlussendlich erreicht werden muss.

    Freundliche Grüsse

    exc-jdbi
    @exc-jdbi das ist hier nur zum verdeutlichen wo meine Verständnisschwierigkeit liegt. Natürlich mache ich das Form nicht auf und gleich wieder zu.
    Ich erstelle eine Forminstanz, die nicht sichtbar sein soll, daher hatte ich zunächst .Show weggelassen.
    Dann wird selbstverständlich was mit dem Form gemacht, bevor es wieder geschlossen wird.
    In Beispiel hier, wird das Form2 nach dem Öffnen gleich wieder geschlossen um zu sehen, ob die .FormClosing aufgerufen wird oder eben nicht.
    Der Aufruf von .FormClosing ist in meinem Fall aber nötig, da das Form beim Schließen eine ganz Menge Handler entfernen muss.
    Natürlich könnte ich das auch in .Dispose packen, ich wills aber lieber im .FormClosing.
    Aber .FormClosing wird halt wohl nur aufgerufen, wenn vorher ein .Show erfolgt.

    roepke schrieb:

    Aber .FormClosing wird halt wohl nur aufgerufen, wenn vorher ein .Show erfolgt.
    FormClosing wird beim Schließen der Form geworfen, das Schließen kann per e.Cancel abgebrochen werden.
    Dazu muss selbstverständlich die Form per Show() oder ShowDialog() angezeigt worden sein.
    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!
    @RodFromGermany und wo finde die Info darüber, dass zuvor ein .Show aufgerufen werden muss? Das war nämlich genau mein Probelm, warum .FormClosing eben nicht aufgerufen wurde.
    .Show verbinde ich mit dem sichtbar machen des Forms, gleichbedeutend mit .Visible = True. Warum hat das Einfluss auf .FormClosing?
    (MS: Das Anzeigen des Formulars entspricht dem Festlegen der Visible Eigenschaft auf true.)
    ich weisses auch nicht. Gut möglich, dass Microsoft es so auffasst, dass ein nicht sichtbares Form eben nicht schliessen kann - daher gibts auch kein Closing-Event.
    Technischer Hintergrund wird wahrscheinlich sein, dass kein WinidowHandle existiert - weil das wird erst im Zuge der Anzeige erzeugt.

    Andere Sache: Ein Form unsichtbar im Hintergrund laufen lassen sieht mir nach einer Lösung aus, die auch besser zu lösen wäre. Wenn das Form nicht anzeigt, dann wird das, was es tun soll, sicherlich auch anders getan werden können, ganz ohne dass dieses Form ühaupt erstellt sein muss.
    Jou.

    roepke schrieb:

    .Show verbinde ich mit dem sichtbar machen des Forms, gleichbedeutend mit .Visible = True.
    Das ist offensichtlich falsch.
    Du kannst mit .Opacity = 0 Deine Form unsichtbar machen.
    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!
    Besten Dank an alle.
    Ich behalte das mit dem notwendidgen .Show mal im Hinterkopf.
    Ich habe die Funktionen des Forms, um die es mir eigentlich im wesentlichen ging, in eine Klasse ausgelagert.
    Dadurch kann ich mir zum einen das Öffnen des Forms sparen und zum anderen hat mir die Diskussion, die mich auch zum vermehrten Nachdenken angregte gezeigt, dass der schnellste Weg nicht unbedingt der beste ist.