Odświeżanie/Rysowanie kontrolek na formie

0

Witam,

Zaciąłem się na totalnej bezydurze i od godziny nie moge ruszyć.

Mam już gotowy program, który wykonuje sobie zestawienia produktów, przelicza, wylicza, generuje raporty itd.

Przy starcie programu musze pobrać dość sporo danych z bazy danych i przy okazji przelistować procesy i sprawdzić aktualne kursy walut. Program ładuje się parę sekund, czym może wprowadzić pewien niepokój u użytkownika.

Meritum:

Stworzyłem forma, na którym podczas odpalania programu wyświetlam progressbar'a + obrazek + label'a.

Label informuje o aktualnie wykonywanej czynności, a progressbar pokazuje stan.
Problem jest następujący - najpierw uruchamia mi się progressbar i dopiero po dojściu do 100% rysuje się reszta formy...

Kontrolki rysuję dynamicznie.
Proszę o pomoc.

0

Utwórz osobny wątek w którym dokonujesz tych swoich cudów. Nie może wszystko to się dziać w FormCreate.

0

cały czas to samo...

0

@Azarien ma racje, trzeba sobie pomóc drugim wątkiem. Spróbuj tak:
W FormShow, FormLoad, czy jakkolwiek głównej formy pokazujesz tę drugą, modalnie. W drugiej formie dodajesz BackgroundWorkera, tak będzie najwygodniej. Ustawiasz jego DoWork, ProgressChanged i RunWorkerCompleted i na FormShow uruchamiasz BackroundWorkera (RunWorkerAsync) co odpali DoWork().
Jeszcze wcześniej w drugiej formie(tej z progressBarem) deklarujesz delegat, który ustawiasz w formie głównej, a jest to metoda która sprawdza kursy walut. No i wtedy w DoWork BakcgroundWorkera wywołujesz w odpowiedniej pętli ten delegat. Po każdym wywołaniu raportujesz progres (ProgressChanged) odświerzając label i progressBar. Po wszystkim wywołuje się RunWorkerCompleted(), zamykasz i wywołujesz Dispose() formy z progressbar'em. Pewnie brzmi to niezbyt składnie ;-P ale może troche kodu poniżej pomoże
Główna forma:

FormShow(...)
{
 FormaModalna fm = new FormaModalna();
 fm.Delegat += new  FormaModalna.JakisDelegat(SprawdzWaluty);
 fm.Owner = this;

 //mozesz dodac jeszcze informacje o pomyslnie zakonczonej opracji
 if (fm.ShowDialog() == DialogResult.OK)
 {
  fm.Dispose();
  return true;
 }
 fm.Dispose();
 return false;
}

Forma modalna

public delegate JakisDelegat();
public JakisDelegat delegat;
private BackgroundWorker BW = new BackgroundWorker();

public FormaModalna()
{
 BW.WorkerReportsProgress = true; 
 BW.WorkerSupportsCancellation = true; //jezeli chcesz anulowac prace BW

 BW.DoWork += BWDoWork; 
 BW.ProgressChanged += BWProgressChanged;
 BW.RunWorkerCompleted += BWCompleted;
}

FormShow(...)
{
 BW.RunWorkerAsync();
}
BWDoWork(...)
{
 do
 {
  delegat();
  BW.ReportProgress(percent);
 }while(warunek)
}
BWReportProgress(...)
{
 //update labela i progressBar'a
}
BWCompleted(...)
{
 if(warunek)
  this.DialogResult = DialogResult.OK;
 else
  this.DialogResult = DialogResult.Cancel;
}

Mam nadzieje, że pomoże
A i tu jeszcze przydatny link http://www.albahari.com/threading/part3.aspx#_BackgroundWorker

1 użytkowników online, w tym zalogowanych: 0, gości: 1