Komisch?

DerStauner

Erfahrenes Mitglied
Ich habe ein ganz einfaches Programm: ein button und ein label.

Der Code des Buttons sieht so aus:
Code:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Label1.Text = "Suche Folder..."
        Dim konyvtartomb As New DirectoryInfo("c:\windows")

        konyvtartomb.GetDirectories("*.*", SearchOption.AllDirectories)
    End Sub

ich habe absichtlich als Hauptordner c:\windows angegeben, damit es sehr lange dauert, alle Unterordner zu ermitteln. Vorher setze ich den Text des Labels auf "Suche Folder".

Was ich aber nicht verstehe, ist, dass das Label seinen Text erst danach aufnimmt, nachdem das Listing-Prozess beendet wurde. Warum?
Mich treibt es schon in den Wahnsinn. Nur das fehlt zu meinem Programm.
 
Zuletzt bearbeitet:
Füge das nach der Textänderung ein, dann wird die Form vor der Aktion aktualisiert und zeigt den Text damit auch vorher an: Me.Refresh()

Damit sieht dein Code dann so aus:

Code:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Label1.Text = "Suche Folder..."
       Me.Refresh()

       Dim konyvtartomb As New DirectoryInfo("c:\windows")

       konyvtartomb.GetDirectories("*.*", SearchOption.AllDirectories)
End Sub
 
Tausend Dank.

Zufälligerweise weisst Du es nicht, wie man das Prozess, in dem alle Subfolder von c:\windows gelistet werden, mit einem Progressbar darstellt

Wie kann ich das Maximum value des Progressbars einstellen, wenn ich vor dem Starten nicht weiss, wie viele Folder es geben wird?

Und wie kann ich dann das Value des Progressbars steigern Also wie kann man abfangen, wenn man einen Folder gefunden hat und kommt der nächste?
 
Zufälligerweise weisst Du es nicht, wie man das Prozess, in dem alle Subfolder von c:\windows gelistet werden, mit einem Progressbar darstellt
Eine Fortschrittsanzeige wird hier wohl nicht realisieren lassen, da es zum einen (wie du schon festgestellt hast) keine Infos über die Anzahl der Ordner gibt und man zum anderen von dem mit GetDirectories() angestossenem Vorgang keinen Zwischenstand bekommt.


Gruß
MCoder
 
Hi

Aber bitte nicht mit der Methode Refresh. Diese ist für diese Zwecke zu teuer. Vorallem wenn die Refresh Methode der Form genutzt wird. Da hier die komplette Form neu gezeichnet wird. Was jedoch nicht nötig ist.

Besser ist in solchen Fällen Application.DoEvents zu nutzen. Diese gibt der Anwendung die Gelegenheit, alle anstehenden Ereignisse auszuführen.

Der Text wird daher nicht sofort im Label angezeigt, da diese Anweisung sehr schnell ausgeführt wird. Dein Programm führt schon das langwierige Suchen aus, während noch das Zeichnen des Controls ansteht. Da dein Programm jedoch schon wieder beschäftigt ist, muss das Zeichnen warten

//EDIT:
Und bitte auf einen passenden Betreff achten! danke
 
Sorry wenn ich michz kurz zwischen schalte.
Aber ist DoEvents nicht teurer?
Wie du schon sagtest werden hier sofort alle anstehenden Ereignisse verarbeitet.
Und auf msdn gibt es ja auch einen Warnhinweis dazu:
Calling this method can cause code to be re-entered if a message raises an event.

Ich würde nur Label1.Refresh aufrufen.
 

Neue Beiträge

Zurück