Edyta Ratajczyk

Edyta Ratajczyk
programista/bazodano
wiec/analityk
biznesowy IT

Temat: C# - progresbar - jak???

Witam.
Problem zapewne trywialny, ale już mi wsio opada...
Na statusbarze - progresbarr i label.
I dwie sprawy.
1. Z aplikacji łączę się do bazy i pobieram dane - co może trwać. Chciałabym, by user widział, że coś się dzieje. Zmienić typ paska postępu na marque i niech się mieni. ponieważ mam go jeszcze gdzieindziej jako nie marque tylko continuos - robię tak:

tsbLabel.Text = "Trwa pobieranie danych";
tsbProgress.Value = 0;
tsbProgress.Maximum = 100;
tsbProgress.Step = 1;
tsbProgress.Style = ProgressBarStyle.Marquee;
tsbProgress.MarqueeAnimationSpeed = 100;
this.Refresh();

Ale to nie działa - nie mieni się - formularz jest "martwy".

2. Po pobranu danych - przetwarzam je. Tu mnie interesuje ile jeszcze do końca i mam:
tsbProgress.Value = 0;
tsbProgress.Maximum = dvGlowki.Count;
tsbProgress.Style = ProgressBarStyle.Continuous;
this.Refresh();
[...]
i w foreach:
tsbLabel.Text = drvGlowki["nazwa"].ToString();
tsbProgress.PerformStep();
statusStrip1.Refresh();
this.Refresh();
[...]
nie ważne, czy status, czy this odświeżam - nie hula.
Na końcu mam radosne pip...
Czy może to być zależne od np. ilości wierszy? Ale wtedy przynajmniej zmianę label'a powinnam widzieć.
Help - bo mnie już trafia...

Temat: C# - progresbar - jak???

Trzeba progresbara uaktualniać w osobnym wątku. Dopóki nie "wyskoczysz" z bieżącej funkcji, która odczytuje coś z bazy, nie zostanie wywołane zdarzenie OnPaint dla formularza, którego funkcja dotyczy.

Można wykorzystać komponent BackgroundWOrker
http://www.ondotnet.com/pub/a/dotnet/2005/07/25/backgr...

EDIT: kurcze, Paweł był szybszy :PAdrian Olszewski edytował(a) ten post dnia 25.02.09 o godzinie 13:31

konto usunięte

Temat: C# - progresbar - jak???

Dokładnie. Albo skorzystaj z BackgroundWorker'a który ma odpowiednie metody do wywoływania, w których po prostu będziesz update'ować progressbar'a.
Norbert M.

Norbert M. Nobody's perfect.
Call me Nobody ;)

Temat: C# - progresbar - jak???

A nie wystarczyłoby wywołanie Application.DoEvents()?

konto usunięte

Temat: C# - progresbar - jak???

Pewnie by wystarczyłoby dodać to w pętli, ale nie sądzisz, że takie rozwiązanie jest co najmniej sztuczne i nieładne? Są lepsze 'narzędzia' do tego celu.
Norbert M.

Norbert M. Nobody's perfect.
Call me Nobody ;)

Temat: C# - progresbar - jak???

Paweł Łukasik:
Pewnie by wystarczyłoby dodać to w pętli, ale nie sądzisz, że takie rozwiązanie jest co najmniej sztuczne i nieładne? Są lepsze 'narzędzia' do tego celu.

No jasne, że to brudne rozwiązanie, ale szybkie w implementacji. Stosowałem je przy prostych pętlach, ale przy większy zawsze korzystałem z wątków. Jestem zwolennikiem porządnych rozwiązań, ale z autopsji wiem, że nie zawsze jest na nie czas :/.
Dlatego bardziej zapytałem niż stwierdziłem. Być może w tym wypadku byłoby to wystarczajęce.

konto usunięte

Temat: C# - progresbar - jak???

Nie ma sensu wymyślać koła na nowo. Jak już parę osób napisało - BackgroundWorker. Chyba, że ktoś "lubi ból, deadlocki i znikające pulsy" to może sam sobie wyrzeźbić na threadach i manual/autoreseteventach.



Wyślij zaproszenie do