Het lijkt allemaal erg standaard en ik ben al drie avonden/nachten aan het lezen en proberen maar ik krijg mijn progressbar niet aan de gang.
De situatie:
Ik heb een form met een GO-knop, een Cancel-knop, een label, een progressbar en een backgroundworker.
Ik heb een class die uit drie hoofddelen bestaat: start-functie, deze maakt een connectie met een database, voert een query uit en returned een datatabel, verder maakt die een bestand aan en vult daar de header van in;
De end- functie, deze functie slaat het bestand op; De body-functie, deze loopt door de datatable heen en doet wat berekeningen en vult de resultaten in het bestand.
De body-functie duurt het langste (minuten) en die heb ik in een aparte thread (backgroundworker) gezet, in de hoop dat ik dan de progressbar kan updaten.
Eerst maar wat relevante code:
Als ik een breakpoint zet op worker.ReportProgress(numRows); dan komt die er wel, maar gaat niet naar backgroundWorker1_ProgressChanged()
Ik snap het niet meer, ik krijg geen foutmeldingen. Mijn form blijft netjes actief, de Cancel-knop werkt, maar niet de progressbar.
Als iemand me even in de juiste richting wil sturen, dan komt dat mijn nachtrust enorm ten goede
De situatie:
Ik heb een form met een GO-knop, een Cancel-knop, een label, een progressbar en een backgroundworker.
Ik heb een class die uit drie hoofddelen bestaat: start-functie, deze maakt een connectie met een database, voert een query uit en returned een datatabel, verder maakt die een bestand aan en vult daar de header van in;
De end- functie, deze functie slaat het bestand op; De body-functie, deze loopt door de datatable heen en doet wat berekeningen en vult de resultaten in het bestand.
De body-functie duurt het langste (minuten) en die heb ik in een aparte thread (backgroundworker) gezet, in de hoop dat ik dan de progressbar kan updaten.
Eerst maar wat relevante code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| this.backgroundWorker1.WorkerReportsProgress = true; this.backgroundWorker1.WorkerSupportsCancellation = true; this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted); this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged); private void btnGo_Click(object sender, EventArgs e) { this.lblProgress.Text = "Creating shapefile"; this.clsWork = new workCode(); this.clsWork.createFile(this); this.lblProgress.Text = "File is created."; this.progressBar1.Value += 1; this.lblProgress.Text = "Start computing ..."; this.backgroundWorker1.RunWorkerAsync(); } private void btnCancel_Click(object sender, EventArgs e) { // Cancel the asynchronous operation: this.backgroundWorker1.CancelAsync(); this.btnCancel.Enabled = false; } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { // Get the BackgroundWorker that raised this event. BackgroundWorker worker = sender as BackgroundWorker; worker.ReportProgress(1); // Loop through all records and fill the file: clsWork.executeQueryThread(worker,e); } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { int percentage = e.ProgressPercentage / this.progressBar1.Maximum * 100; if (percentage < 1) percentage = 1; this.progressBar1.Value = percentage; this.progressBar1.Refresh(); this.lblProgress.Text = percentage.ToString() + "% completed."; this.lblProgress.Refresh(); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Result.ToString() == "Finished") { this.lblProgress.Text = "Saving file"; this.backgroundWorker1.ReportProgress(this.progressBar1.Maximum); this.clsWork.saveFile(); } } |
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| public void executeQueryThread(BackgroundWorker worker, DoWorkEventArgs e) { foreach (DataRow row in this.qResults.Rows) { if (worker.CancellationPending) { e.Cancel = true; return; } [..] // Op specifiek interval, update the progressbar: // Dit werkt dus niet, er gebeurt niets: worker.ReportProgress(numRows); numRows++; } // foreach (rij in qResults.Rows) e.Result = "Finished"; } |
Als ik een breakpoint zet op worker.ReportProgress(numRows); dan komt die er wel, maar gaat niet naar backgroundWorker1_ProgressChanged()
Ik snap het niet meer, ik krijg geen foutmeldingen. Mijn form blijft netjes actief, de Cancel-knop werkt, maar niet de progressbar.
Als iemand me even in de juiste richting wil sturen, dan komt dat mijn nachtrust enorm ten goede