progressBar wird nicht aktualisiert

27/07/2008 - 21:29 von Felix Buck | Report spam
Hallo,

ich habe ein Problem mit einer progressBar im Zusammenspiel mit dem
Background Worker. Leider wird der Fortschrittsbalken nicht aktualisiert
gerendert, er bleibt die ganze Zeit im Ausgangsstatus.
Meine Recherchen haben ergeben, dass der Aufruf von Refresh() bzw. DoEvents
Abhilfe schaffen sollen, klappt aber auch nicht :(
Folgendes Szenario:

//in der Form:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
logic.randomCopy(textBoxSrc.Text, textBoxDest.Text);
}

private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
//progressBar1.Refresh(); //bringt nichts
//Application.DoEvents(); //bringt leider auch nichts
}


Die Logic-Klasse ist von der Form abgeleitet und darf auf den
backgroundWorker zugreifen.
In der in DoWork abgearbeiteten Methode mache ich Folgendes:

public Boolean randomCopy (String srcDirectory, String destDirectory)
{
...
foreach ( ... )
{
...
backgroundWorker1.ReportProgress(currentPercentage); // 0..100
...
}
}

Wàre toll, wenn jemand eine Lösung hàtte. Habe mir das gar nicht so
schwierig vorgestellt, Fortschrittsbalken werden ja so hàufig eingesetzt...
Danke im Voraus,

Felix
 

Lesen sie die antworten

#1 Frank Dzaebel
27/07/2008 - 23:39 | Warnen spam
Hallo Felix,

ich habe ein Problem mit einer progressBar im Zusammenspiel mit dem
Background Worker. Leider wird der Fortschrittsbalken nicht aktualisiert
gerendert, er bleibt die ganze Zeit im Ausgangsstatus.



übergib der Logic-Klasse explizit die backgroundWorker1-Instanz,
aus der Original-Form, denn wenn Du die Logic-Klasse
von Form1 ableitest, ist das eine neue Instanz!

BackgroundWorker bw;
public Logic(BackgroundWorker bw) {this.bw = bw;}
// .
Aufruf dann: logic = new Logic(backgroundWorker1);
Bei RandomCopy dann:
bw.ReportProgress(currentPercentage);

____________
Ein Application.DoEvents() o.à. ist an dieser Stelle übrigens
nicht sinnvoll, das funktioniert auch komplett ohne.




Wàre toll, wenn jemand eine Lösung hàtte. Habe mir das gar nicht so
schwierig vorgestellt, Fortschrittsbalken werden ja so hàufig
eingesetzt...



ist ja auch eigentlich sehr sehr einfach. Aber Du hast da
durch die Ableitung was mit den Instanzen durcheinanderbekommen.
Hier ja etwa ein einfaches Beispiel:

[Bearbeiten von Steuerelementen aus Threads]
http://dzaebel.net/ControlInvoke.htm

Ich würde Deine Logic-Klasse eher von der Ableitung
entkoppeln (wenn möglich), oder Verfahren wie hier benutzen:

[FTP Upload mit Byte-Anzeige]
http://dzaebel.net/FtpUpload.htm


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen