C# Progress bar füllt sich nicht komplett aus?

...komplette Frage anzeigen

3 Antworten

Es wäre sinnvoller, wenn Du beim Erreichen der 100 einen weiteren Tick abwartest, damit das System die Gelegenheit erhält, den Fortschrittbalken komplett zu zeichnen.

==> "increment" mit "else" hinter die Messagebox-Anzeige.

Antwort bewerten Vielen Dank für Deine Bewertung
Maassmaenchen 13.06.2016, 19:14

hä?


so oder was


else
{
progressBar1.Increment(1);
}
0
Mikkey 13.06.2016, 19:31
@Maassmaenchen

Hat denn der Progressbar auch 100 als "Maximum"?

Ansonsten als Test mal einen Label mit dem Value belegen, damit man sieht, wie sich das verhält.

Ach ja...

Es ist generell (in jeder Sprache) ungünstig, die Werte von Steuerelementen für die Programmsteuerung zu verwenden, besser ist es, einen eigenen Zähler zu definieren, aus dem man jeweils den Wert des Steuerelements setzt.

0
Maassmaenchen 13.06.2016, 19:36
@Mikkey

ja ich hatte auch schon drin: if (progressBar1.Value == progressBar1.Maximum)

oder so hat aber auch nicht funktioniert.

0
Maassmaenchen 13.06.2016, 19:38
@Maassmaenchen

ich vermute die animation ist einfach langsamer als der prozess


weil je langsamer der timer desto weiter kommt der balken

0
Mikkey 13.06.2016, 19:45
@Maassmaenchen

Nein, das kann nicht sein, so langsam ist das Rendern nicht, dass der Balken auf der Hälfte stehen bleiben würde.

Hast Du das mit dem Label ausprobiert? Separaten Zähler

if (zaehler1 < maxValue) {
progressBar1.Value = ++zaehler;
label1.Text = zaehler.toString();
} else {...
0
Mikkey 13.06.2016, 21:21
@CrystalixXx

Natürlich ist es nicht so.

Ich habe diesen Code ausprobiert, er läuft genauso, wie man sich das vorstellt, abgesehen davon, dass die Box etwas vor dem vollständigen Balken kommt:

void Timer1Tick(object sender, EventArgs e)

{
if (progressBar1.Value < progressBar1.Maximum)
progressBar1.Value++;
else
{
timer1.Stop();
MessageBox.Show("Fertig", "Fortschritt", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, 0);
}
}
0
CrystalixXx 13.06.2016, 21:23
@Mikkey

Setz den Timer auf ein Interval von 20 ms und du erkennst bei aktiviertem Aero-Design ab Windows Vista einen zeitlichen Versatz. Da lassen sich auch viele Beiträge im Internet dazu finden.

0
Mikkey 13.06.2016, 22:00
@CrystalixXx

In meiner Umgebung kann ich Aero nicht aktivieren, abgesehen davon ist es abgekündigt.

Der Code läuft einwandfrei, man möge dem nicht die Schuld an Bugs aus einem missgestalteten Framework geben.

0

Du hast mit deiner Vermutung der "langsamen Animation" recht.

Seit Windows Vista ist das Redesign der Progressbar für ein solches Verhalten verantwortlich. Wird der Wert erhöht, dann wird durch Windows eine Animation ausgelöst, die diese Änderung progressiv anzeigt. Je schneller der Wert erhöht wird, desto mehr scheint die Animation hinterher zu hängen.

Eine Möglichkeit diese Animation zu umgehen wäre es beispielsweise den Wert nach dem Erhöhen wieder zu verringern. Zum Beispiel so:

if (progressBar1.Value == progressBar1.Maximum - 1)
{
progressBar1.Increment(1);
}
else
{
progressBar1.Increment(2);
progressBar1.Increment(-1);
}
Antwort bewerten Vielen Dank für Deine Bewertung

Vermutlich musst du noch einen Window-Update abwarten. Bin mir nicht ganz sicher ob das in .Net so geht, aber ein Thread.Sleep(100) könnte schon helfen nach dem timer1.stop(); 

Warum setzt du den ProgressBar1.Value wieder auf 0? Du musst dir mal überlegen wie schnell das alles abläuft. Zwischen dem Increment  und dem MessageBox.Show vergehen ein paar µs. Selbst wenn die Anzeige aktualisiert würde würde das nichtmal an deinem Bildschirm ankommen.

Antwort bewerten Vielen Dank für Deine Bewertung
Maassmaenchen 13.06.2016, 19:59

thread.sleep(100) kennt c# aber nicht

0
Sivsiv 13.06.2016, 20:07
@Maassmaenchen

Da hast du recht. Es muss heissen:

Thread.Sleep(100);

Aus 

using System.Threading;
0

Was möchtest Du wissen?