(Netzwerk-)FolderBrowserDialog im Hintergrund laden

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von sippaholic.

    (Netzwerk-)FolderBrowserDialog im Hintergrund laden

    Hallo,

    ich benutze in meinem Programm den FolderBrowserDialog, der nur die Netzwerkordner anzeigt. Wenn ich nun auf den Button klicke, um den Dialog anzuzeigen, braucht es erstmal eine Weile, bis die Netzwerkordner geladen sind.

    Ich würde gerne diese Wartezeit umgehen. Folgende Optionen sind mir dabei eingefallen, wobei ich Probleme habe, diese zu realisieren:

    1) Beim Start des Programmes bereits beginnen, die Ordner im Hintergrund zu laden, sodass sie sofort angezeigt werden können, wenn man den Dialog aufruft
    2) Den Dialog in meine Start-Form (z.B. in ein extra Panel) einbinden und sofort anzeigen, ohne dass dabei ein externes Fenster geöffnet wird. Hierbei sollten die Ordner ja eigtl. auch zu Beginn geladen werden.

    Ich konnte bis jetzt keine hilfreichen Informationen im Internet finde. Zu 2) habe ich nur gefunden, dass man (Microsoft-) Prozesse wie z.B. den Editor in die Form integrieren kann. Dafür bearbeitet man die Eigenschaft Process.MainWindowHandle
    Ähnliche Optionen stehen dem Dialog allerdings meiner Kenntnis nach nicht zur Verfügung.

    Hat jemand eine Idee?

    Danke
    @sippaholic Willkommen im Forum. :thumbup:
    Ist das ein spezieller FolderBrowserDialog oder setzt Du nur Properties (wenn ja: welche)?
    Du kannst diesen Dialog in einem separaten Thread inizialisieren, das stört die GUI nicht.
    Wenn der Thread beendet ist, sollte er ein entsprechendes Event senden, das z.B. einen entsprechenden Button in der GUI enabled.
    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!
    Danke dir :)

    Das ist mein Code für den Dialog:

    VB.NET-Quellcode

    1. Private Sub btnDialog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDialog.Click
    2. Dim dialog As New FolderBrowserDialog()
    3. Dim type As Type = dialog.[GetType]
    4. Dim fieldInfo As Reflection.FieldInfo = type.GetField("rootFolder", _
    5. BindingFlags.NonPublic Or BindingFlags.Instance)
    6. fieldInfo.SetValue(dialog, DirectCast(18, Environment.SpecialFolder))
    7. dialog.ShowDialog()
    8. txtPath.Text = dialog.SelectedPath
    9. End Sub


    Das habe ich allerdings auch nur per C&P aus dem Internet.

    Nun ja, das Problem ist, meiner Ansicht nach, dass er die Ordner erst lädt, wenn man ShowDialog() aufruft. Viel mehr Methoden werden einem ja auch nicht angeboten.
    Und egal, ob ich das nun in einem seperatem Thread oder nur so aufrufe, öffnet es mir ja das Fenster.
    Das Fenster soll aber erst nach einem Klick auf den Button geöffnet werden - nur das Laden der Netzwerkordner dauert mir halt zu lang :/

    Selbst wenn der Dialog schon innerhalb der Anwendung mal aufgerufen wurde, muss er die Ordner beim nächsten Aufruf wieder neu laden.
    Somit bringt auch ein versteckter Aufruf im Hintergrund nichts....
    So ich hab mal rumgespielt.

    VB.NET-Quellcode

    1. Imports System.Reflection
    2. Public Class Form1
    3. Dim dialog As New FolderBrowserDialog()
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. Dim type As Type = dialog.[GetType]
    6. Dim fieldInfo As Reflection.FieldInfo = type.GetField("rootFolder", _
    7. BindingFlags.NonPublic Or BindingFlags.Instance)
    8. fieldInfo.SetValue(dialog, DirectCast(18, Environment.SpecialFolder))
    9. End Sub
    10. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    11. dialog.ShowDialog()
    12. txtPath.Text = dialog.SelectedPath
    13. End Sub
    14. End Class



    Dabei werden die Ordner geladen wenn das Programm gestartet wird. Es dauert eben jenachdem wieviele Geräte im Netzwerk sind.

    #Edit: Wenn alle ordner da sind, kannst du den Dialog ja mal schießen und wieder öffnen dann sind sie direkt da :)
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    Geniale Lösung. :thumbup:

    sippaholic schrieb:

    wenn man ShowDialog() aufruft
    Ja, sieht so aus.
    Allerdings könntest Du Dir einen eigenen Dialog basteln, via Reflektor Anleihen aus dem Netzwerk nehmen und da eine Initialize-Funktion hinzufügen, die genau das macht.
    Wenn Du mit Framework 4.5 arbeitest, machst Du das über Task(), da läuft das nicht im Hauptthread.
    Und:

    VB.NET-Quellcode

    1. Using dialog As New FolderBrowserDialog()
    2. ' ...
    3. End Using

    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!