Sub nach Schließen eines Childs feuern

  • VB.NET

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

    Sub nach Schließen eines Childs feuern

    Hi zusammen,
    ich bräuchte mal wieder Hilfe :D

    Ich hab eine frmMain, von da aus rufe ich über ein TreeView diverse Childs auf.
    Nun möchte ich abfangen, wann ein bestimmtes Child geschlossen wurde um folgende Sub auf der frmMain auszuführen:

    VB.NET-Quellcode

    1. Private Sub checkToDoList()
    2. _todoCount = 0
    3. Dim lstToDo = Dts.ToDo.Where(Function(x) x.userID = _userID AndAlso x.faellig <> _defaultDate)
    4. If lstToDo.Count > 0 Then
    5. For Each rw In lstToDo
    6. If Date.Now > rw.faellig Then _todoCount += 1
    7. Next
    8. tsImgToDo.Text = _todoCount.ToString : tsImgToDo.BackColor = Color.Red
    9. Else
    10. tsImgToDo.Text = "" : tsImgToDo.BackColor = SystemColors.Control
    11. End If
    12. End Sub


    Wenn ich also in meiner ToDo-Liste rumgewurschtelt hab soll er danach prüfen, ob es noch fällige Einträge gibt.
    Bisher wird das beim Programmstart erledigt - zwischendrin wäre aber auch ganz net.

    Mit dem Event "MdiChildActivate" komme ich leider nicht weiter.

    Einen Timer möchte ich ungern verwenden - es geht bestimmt anders, ich weiß nur nicht wie. Ich könnte das auf der frmToDo
    beim Closing erledigen, komme von da aber ja nicht an die Controls der frmMain dran...
    EDIT: ich komme schon dran aber nur via frmMain.tsImgToDo.Text .... und so wie ich das gelernt hab, soll man das ja so nicht tun ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @tragl Du kannst in der FormMain das Closed-Event des Childs abonieren:

    VB.NET-Quellcode

    1. Dim dlg = New FrmChild()
    2. AddHandler dlg.Closed, AddressOf ChildClosed
    3. dlg.Show()

    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!
    ich glaub ich hatte so nen ähnlichen Fall hier Selbstgehäkeltes mdi-modul - passt das so?
    schonmal... der ganze Ablauf für die Childs ist ja eher komplex, damit es auch ordentlich aussieht.
    Das ganze liegt aber in einem Modul in einem Helfer-Projekt, sodass kein direkter Austausch da ist.

    Kann man nicht über das Event MdiChildActivate auf frmMain den sender casten und dessen Status abfragen?
    die Beschreibung dazu lautet: "Tritt ein, wenn ein untergeordnetes MDI (Multiple Document Interface)-Formular in einer MDI-Anwendung aktiviert oder geschlossen wird."

    Edit: Hab's nun wie folgt lösen können - könnt mir ja mal sagen, ob das so richtig ist - aber scheint zu klappen :)

    VB.NET-Quellcode

    1. Private Sub frmMain_MdiChildActivate(sender As Object, e As EventArgs) Handles Me.MdiChildActivate
    2. disableEnableMaChange()
    3. Dim frm = TryCast(sender, Form)
    4. If frm.NotNull Then
    5. If frm.ActiveMdiChild Is frmToDo Then
    6. AddHandler frmToDo.FormClosed, AddressOf ToDo_Closed
    7. End If
    8. End If
    9. End Sub
    10. Private Sub ToDo_Closed(sender As Object, e As FormClosedEventArgs)
    11. checkToDoList()
    12. End Sub

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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

    Ja, geht. Wenn Du die MdiChildren (ich bin einfach mal so haarspalterisch ;) ) in einer List(Of ) erfasst …. (Brauchst Du ja gar nicht. Geht auch ohne) wird beim Schließen ja jener EventHandler aufgerufen und die Mdi-Child-Form-Property Disposing ist dabei True.

    VB.NET-Quellcode

    1. Public Class FrmMain
    2. Private MdiChildIndex As Integer = 0
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim NewChild = New Form1 With {
    5. .MdiParent = Me,
    6. .Text = "Child" & MdiChildIndex
    7. }
    8. NewChild.Show()
    9. MdiChildIndex += 1
    10. End Sub
    11. Private Sub FrmMain_MdiChildActivate(sender As Object, e As EventArgs) Handles Me.MdiChildActivate
    12. Dim ClosingChild = MdiChildren.FirstOrDefault(Function(x) x.Disposing)
    13. If ClosingChild Is Nothing Then Return
    14. MessageBox.Show($"Das MDI-Child-Form mit dem Titel {ClosingChild.Text} wird gerade geschlossen.")
    15. End Sub
    16. End Class

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    tragl schrieb:

    Das ganze liegt aber in einem Modul in einem Helfer-Projekt, sodass kein direkter Austausch da ist.
    Kann es sein, dass da Code drinne liegt, der da nicht rein gehört (z.B. EventHandler)?
    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
    Ja, da sind u.a. auch Eventhandler drin

    AddHandler _mdiParent.MdiChildActivate, AddressOf MdiChildOpen
    AddHandler _tabControl.SelectedIndexChanged, AddressOf Tab_SelectedIndexChanged

    ich hab eben den Vorteil, dass ich für jedes Projekt (sofern ich die Helfer einbinde) direkt mein "TabbedMDI" nutzen kann ohne groß was zu coden.

    @VaporiZed
    so in etwa hab ich's ja gelöst. Ich brauch halt explizit das eine Child. Wenn's das nicht ist, dann passiert ja auch nix ;)

    Ist immer komisch. Hab den ganzen abend gestern gegrübelt, wie ich das anstelle. Dann stell ich nen Post hier rein und währen dem Antworten kommt mir dann die Lösung :S
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    ich hab eben den Vorteil
    Überleg mal, ob Du das in eine Partial Class der betreffenden Form umarbeitest.
    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!

    tragl schrieb:

    Ist immer komisch. ,,, stell ich nen Post hier rein und währen dem Antworten kommt mir dann die Lösung
    Dassis ganz normal - das menschliche Gehirn arbeitet leider so:
    Der ernsthafte Versuch, einem wie auch immer gearteten Gegenüber verständlich darzustellen, was man nicht versteht führt in vielen (womöglich sogar meistens) zum Verstehen.
    Und ohne Gegenüber funzt das scheints net, bzw. nicht ansatzweise so gut.

    RodFromGermany schrieb:

    Überleg mal, ob Du das in eine Partial Class der betreffenden Form umarbeitest.


    Dann muss aber beides im selben Projekt liegen nehme ich an... Könnte ja sein, dass in einer anderen Anwendung die frmMain dort frmHaupt oder was auch immer heißt - oder bin ich da jetzt falsch

    @ErfinderDesRades
    ist wohl so :D
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Wenn Du wüsstest, wieviele Fragethreads ich schon im Forum angefangen hatte, mir einen Roman zusammengeschrieben hatte, um das Problem genau zu umschreiben und dann das Ganze vor dem Absenden verworfen hatte, weil mir beim Beschreiben des Problems die Lösung kam …

    ErfinderDesRades schrieb:

    Und ohne Gegenüber funzt das scheints net, bzw. nicht ansatzweise so gut.
    Alternative, wenn kein Mensch oder Forum herhalten kann: Rubber Duck Debugging
    Dafür habe ich sogar eine Spezialente, die mir zuhören muss.
    Bilder
    • Duck.png

      89,69 kB, 300×300, 27 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    tragl schrieb:

    Könnte ja sein, dass in einer anderen Anwendung die frmMain dort frmHaupt oder was auch immer heißt - oder bin ich da jetzt falsch
    Wenn Du im Modul fern Klassen behandelst, musst Du denen auch die Namen und Instanzen der Klassen übergeben, anscheinend funktioniert es da.
    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!