Unterformular aktualisieren

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Unterformular aktualisieren

    Hallo

    Ich habe auf einem Formular (Hauptformular) ein Tabcontrol. Auf der betreffenden Tabpage liegt (aus optischen Gründen) eine Groupbox und auf dieser ein Panel, in welche ich das Unterformular wie folgt lade, bzw. anzeige, sobald der Countdown (alle 10 Minuten) Null (00:00:00) erreicht hat. Dieser Ablauf findet also alle 10 Minuten statt und dient dazu, z.B. auf der HD das Vorhandensein gewisser Dateien zu überprüfen. Auf dem Unterformular hat es dann eine ganze Anzahl (dynamisch generierter) Labels (als kleine Vierecke) über deren Hintergrundfarbe (entweder grün = alles in Ordnung, gelb = achtung und rot = Alarm) eine Art Warnsystem dem User über den Stand der Dinge Auskunft gibt.

    Wenn nun also der Countdown Null erreich hat, lade ich das Unterformular wie folgt:

    Quellcode

    1. Dim f2 As New frmSubFormUnterformular
    2. f2.TopLevel = False
    3. f2.Dock = DockStyle.Fill
    4. f2.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    5. Me.Panel1.Controls.Add(f2)
    6. f2.Show()


    Auf diesem eben geladenen Unterformular hat es übrigens auch noch in einer Groupbox eine Listbox, die einzelne, bestimmte Dateinamen anzeigt, wenn sie z.B. an falscher Stelle vorhanden sind. Soweit klappt das alles ausgezeichnet.

    Nun sollte beim nächsten Durchgang, wenn der Timer also wieder Null erreicht hat, entweder das Unterformular geschlossen und neu geladen oder einfach aktualisiert werden. Das will mir aber einfach nicht gelingen.

    Dabei habe ich schon alles mögliche an refresh's (für die Listbox selbst, die die Listbox enthaltende Groupbox, das ganze Unterformular, das Panel, die darüber befindliche Groupbox, sowie das Tabcontrol) versucht. Alles ohne den gewünschten Erfolg, und dies obwohl ich sicher bin, dass der Inhalt der Listbox zwischenzeitlich ein anderer ist, bzw. andere Dateinamen enthält. Auch das mit dem Schliessen und an richtiger Stelle wieder öffnen, bzw. neu Laden des Unterformulars habe ich nicht hinbekommen.

    Ich wäre sehr froh, wenn mir hier jemand ein Stück weiterhelfen kann und danke schon mal im Voraus bestens für jeglichen Feedback. Da VB-Anfänger am liebsten gleich mit dem entsprechenden Code-Snippet ;)
    Hallo ErfinderDesRades

    Völlig berechtigt, da ich es bisher immer mit refresh's versucht habe. Nun habe ich folgendes probiert:

    Quellcode

    1. frmUnterformular.GroupBox_NichtErkannteDateinamen.Refresh()
    2. Me.Refresh()
    3. Me.Panel1.Refresh()
    4. GroupBox6.Refresh()
    5. TabPage2.Refresh()
    6. frmUnterformular.Hide()
    7. frmUnterformular.Close()
    8. If fncFormIsLoaded("frmUnterformular") Then
    9. MsgBox("Wird ge-refresht")
    10. frmUnterformular.GroupBox_NichtErkannteDateinamen.Refresh()
    11. Me.Refresh()
    12. Me.Panel1.Refresh()
    13. GroupBox6.Refresh()
    14. TabPage2.Refresh()
    15. frmUnterformular.Hide()
    16. frmUnterformular.Close()
    17. Else
    18. MsgBox("Wird geladen")
    19. ' Das Unterformular "frmUnterformular" wird geladen
    20. Dim f2 As New frmUnterformular
    21. f2.TopLevel = False
    22. f2.Dock = DockStyle.Fill
    23. f2.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    24. Me.Panel1.Controls.Add(f2)
    25. f2.Show()
    26. End If


    Leider zeigt auch das nicht den gewünschten Effekt. Und da ich in Unterformular in der Routine FormClosing eine MessageBox drin habe, weiss ich, dass die Close-Befehle hier im Hauptformular gar nicht funktionieren. Es bleibt stets die Anzeige, wie beim allerersten Laden des Unterformulars.

    Was mache ich falsch?
    ich glaub, du verwechselst auch Klasse und Objekt. gugge VeryBasics

    durch

    VB.NET-Quellcode

    1. frmUnterformular.Close()
    wird die defaultInstanz von frmUnterformular geschlossen (frmUnterformular ist ja eiglich eine Klasse, kein Objekt).
    Wenn auf deim Form aber eine annere frmUnterformular - Instanz ist (und das ist ja mindest nach jedem Refresh der Fall), fühlt die sich von obigem Code nicht so sehr angesprochen.
    Danke für Deine prompte Antwort.

    Ich habe die Theorie jetzt ein paar Mal gelesen und glaube, das schon so einigermassen zu verstehen. Wenigstens von der Idee her. Aber leider weiss ich nicht, wie ich das jetzt umsetzen muss. Mir fehlen einfach die ensprechenden, aber konkreten Beispiele, oder besser gesagt Muster. Wenigstens mal für den Anfang. Denn dass ich mit f2.ShowDialog das Unterformular anzeigen kann und es auch jedesmal neu geladen wird, konnte ich jetzt sehen. Allerdings bringe ich es trotzdem nicht fertig, das zuvor geladene Unterformular wieder verschwinden zu lassen. Und ausserdem habe ich keinen Plan, wie ich es anstellen muss, dass das ja bestehende Unterformular innerhalb von Panel1 angezeigt wird.

    Kannst Du mir verraten, wie die Lösung aussehen müsste?
    Fast immer isses unnötig und unnötig kompliziert und problematisch, Controls dynamisch zu erzeugen.
    Man kann sich das Gui im Designer ordentlich zurechtmachen, und dann gibts eine Methode "LoadData()", die löscht die alten Daten, lädt neue Daten und befüllt die Controls.
    Wichtig ist, Gui und Daten getrennt zu halten - das geht ganz fabelhaft mit Databinding.
    Du könntest etwa ein Datagridview an eine BindingList(Of FileInfo) binden, sodaß das DGV alle Properties der FileInfos (die du sehen willst) anzeigt.
    Die LoadData-Methode müsste nur diese Bindinglist löschen und neu befüllen, und - plump - hättest du im DGV die aktuellen Daten.
    DGV kann man auch relativ leicht dazu kriegen, abhängig von den Daten verschiedene Hintergrundfarben in den Zellen anzuzeigen und so scherze.
    Auf RecursiveFileSearch gibts Databinding mit FileInfo-Objekten
    @ ErfinderDesRades

    Nochmals besten Dank für die Schützenhilfe und die aufgezeigten, sicher besseren Lösungsansätze.

    @ alle anderen,

    die vielleicht noch interessiert, was mir ursprünglich an Lösung vorschwebte. Denn so, wie das Unterformular ja in das übergeordnete Element "ge-added" wird, so kann es - Intellisense sei dank - auch wieder gelöscht werden. Die Zeile

    Quellcode

    1. Me.Panel1.Controls.Clear()


    vor dem neu Laden des Unterformulars löst das Problem auch.
    ein bischen rabiat, alle Controls von Panel1 zu löschen, aber wenn es eh nur das Unterform enthält, und keine weiteren - ja - dann scheints mir die Umsetzung von Post#2 zu sein ;).

    Übrigens: Kennst du die UserControl-Klasse?
    Weil ein Form ist eiglich nicht dafür da, in ein Panel eingefügt zu werden, genau dafür gibts UserControls (Menü-Projekt-BenutzerSteuerElement hinzufügen...)