Windowsform Vorladen

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

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Westerwälder.

    Windowsform Vorladen

    Guten Morgen,

    kann man eine Form in einem BGW oder Thread "Vorladen" und dann später bei Bedarf nur sichtbar machen?

    Hintergrund:
    Einige meiner Formen brauchen relativ lange, bis sie komplett geladen sind.

    Mein Ansatz bisher:

    VB.NET-Quellcode

    1. Private Sub BGW_Hausstatistik_DoWork(sender As Object, e As DoWorkEventArgs) Handles BGW_Hausstatistik.DoWork
    2. With Hausstatistik ' Form
    3. .Vorladen = True
    4. .Visible = False
    5. .Show()
    6. .Refresh()
    7. End With
    8. End Sub
    9. Private Sub BGW_Hausstatistik_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BGW_Hausstatistik.RunWorkerCompleted
    10. Startmenue.TS_Menue_Haus_Verbrauch.Enabled = True
    11. Me.Vorgeladen_Hausstatistik = True
    12. MsgBox("Fertig")
    13. End Sub


    Mache ich die Form nun sichtbar, sind keine Controls der Form befüllt.
    Gibt es da eine Lösung?
    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()

    @Westerwälder Der BGW läuft in einem anderen Thread als die GUI, das geht schon mal schief.
    Belade die Form im Form_Load-Event mit Daten, da ist sie unsichtbar.
    Überwache dort allerdings, dass die komplette Prozedur abgearbeitet wird, weil einige Exceptions beenden die Form_Load vorzeitig, ohne dass Dir die Exception gemeldet wird.
    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!
    Nun das habe ich schon gelöst. Die Form wird erst sichtbar, wenn alle Daten zur Verfügung stehen.
    Mein Gedanke war, kurz nach Programmstart große Formen schon vorzuladen, sodass beim
    Öffnen die Wartezeit wegfällt.

    Form durch User öffnen:

    VB.NET-Quellcode

    1. Private Sub TS_Menue_Haus_Verbrauch_Click(sender As Object, e As EventArgs) Handles TS_Menue_Haus_Verbrauch.Click
    2. If Hausstatistik.Visible Then Exit Sub
    3. If Hausheizung.Visible Then Exit Sub
    4. If ProThread.Vorgeladen_Hausstatistik Then
    5. Hausstatistik.Visible = True
    6. Exit Sub
    7. End If
    8. With Wartelader
    9. .Label_Anzeige.Text = Nothing
    10. .Label_Anzeige.Text = "Verbrauchsstatistik"
    11. .Label_Warten.Text = "Initalisierung läuft ..."
    12. .Show()
    13. End With
    14. Hausstatistik.Show()
    15. End Sub


    Load_Event in der Form

    VB.NET-Quellcode

    1. Private Sub Hausstatistik_Load(sender As Object, e As EventArgs) Handles Me.Load
    2. If ProThread.Vorgeladen_Hausstatistik Then
    3. ProThread.Vorgeladen_Hausstatistik = False
    4. Me.Opacity = 1
    5. Exit Sub
    6. End If
    7. Me.Visible = False
    8. Me.Opacity = 0
    9. Me.Visible = True
    10. Me.Halt = True
    11. Me.Modus = "A"
    12. Monitor.Form_Initalisieren(Me)
    13. Me.TLPanel_Menue.BackColor = Standard.Farben.Kontrols.FormRand
    14. Me.TS_Berechnung.Visible = False
    15. Me.TS_Speichern.Visible = False
    16. Me.TS_Abbruch.Visible = False
    17. Me.TS_Copyright.Text = Programm.Copyright_Kurz
    18. Me.TS_Prognosejahr.Text = "Prognose Jahr " & Now.Year.ToString
    19. Me.TS_Statistik_Jahr.Text = "Statistik Jahr " & Now.Year.ToString
    20. Verbrauchsstatistik = New MBC_MBSOFT.CVerbrauchsstatistik
    21. With Verbrauchsstatistik
    22. .Datenverbindung = New OleDb.OleDbConnection(Daten.Verbindungsstring_MBSOFT)
    23. .VerbindungsAuftrag = "Select * From VST_Verbrauch Order By Ordnungszahl"
    24. .MitBinding = False
    25. .PrimKeyName = "ID"
    26. .Initalisieren()
    27. End With
    28. With Me.TS_Statistikjahre.ComboBox
    29. .Items.Clear()
    30. For SJ = Verbrauchsstatistik.LetztesStatistikJahr To Verbrauchsstatistik.Startjahr Step -1
    31. .Items.Add(SJ.ToString)
    32. Next
    33. .Text = Verbrauchsstatistik.LetztesStatistikJahr.ToString
    34. End With
    35. Me.Halt = False
    36. Me.TS_Neuanlage.Text = Verbrauchsstatistik.NeuanlageText
    37. Me.Prognose_Anzeigen()
    38. If Not Me.Vorladen Then Me.Opacity = 1
    39. End Sub


    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()

    Westerwälder schrieb:

    kurz nach Programmstart große Formen schon vorzuladen
    Ich kenne Deine Umsetzung nicht.
    Was dauert denn so lange?
    Die Berechnung bzw. das Auslesen der Daten
    oder
    die eigentliche Darstellung?
    Du kannst während des sequenziellen Befüllens der Controls mit Daten das permanente Updaten dieser Controls unterdrücken, da geht das Befüllen wesentlich schneller:

    VB.NET-Quellcode

    1. MyControl.SuspendLayout()
    2. ' MyControl mit Daten befüllen
    3. MyControl.PerformLayout()
    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!
    @Westerwälder Dann trenne zunächst die Darstellung von Lesen und Berechnen.
    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!

    Westerwälder schrieb:

    nur noch zuweisen
    Dann musst Du das tun.
    Überprüfe dabei, ob das SuspendLayout() und PerformLayout() was bringt.
    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!
    Habe nun die beiden Formen, welche die längsten Ladevorgänge hatten, geändert.
    Bei der ersten war es die Berechnung. Hier habe ich diese in einer eigenen Klasse durchgeführt und für die Ausgabe im DGV eine Datatable erstellt.
    Bei der anderen waren viele Datenbank-Zugriffe der Zeitfaktor.
    Beide Aufgaben werden nun nach Start des Programmes in zwei BGW durchgeführt.

    Rod: SuspendLayout und PerformLayout zeigen nun keinen wirklichen Unterschied, da die Daten nur zugewiesen werden.
    Müsste ich wirklich mit der Stopuhr messen.
    Gruß Markus