Bonjour, bonsoir à tous.
Depuis peu de temps j'essaye d'intégrer des BackgroundWorker à mon programme pour éviter les freeze intempestifs de l'application. Actuellement j'ai une ListView qui récupère quelques 9000 lignes de ma base de données pour que le BgW soit utile et pour des tests. J'ai donc mis en place le BgW et fait fonctionné ce dernier correctement. Seulement, j'aimerais rajouter une ProgressBar pour afficher la progression du chargement de la liste, seulement, j'ai un peu de mal à la faire fonctionner.
Voici le code :
Lancement du formulaire :
Le DoWork du BackgroundWorker AVEC le code de la ProgressBar que j'ai tenté d'essayer, sans succès :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 private void userList_Load(object sender, EventArgs e) { if (!backgroundWorker1.IsBusy) { metroListView1.Visible = false; progressBar1.Visible = true; metroLabel2.Visible = true; backgroundWorker1.RunWorkerAsync(); } }
Le ProgressChanged du BackgroundWorker :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
51
52
53
54
55 private void bgw1_DoWork(object sender, DoWorkEventArgs e) { try { using (var cnx = new MySqlConnection("ConnectionString")) { cnx.Open(); var cmd = new MySqlCommand("SELECT * FROM Account", cnx); using (var dr = cmd.ExecuteReader()) { while (dr.Read()) { metroListView1.Invoke((MethodInvoker)delegate { ListViewItem listitem = new ListViewItem(dr["Username"].ToString()); listitem.SubItems.Add(dr["Rang"].ToString()); listitem.SubItems.Add(dr["Mail"].ToString()); metroListView1.Items.Add(listitem); }); progressBar1.Invoke((MethodInvoker)delegate { progressBar1.Maximum = metroListView1.Items.Count;//Dt is your DataTable for (int i = 0; i < metroListView1.Items.Count; i++) { //Do Work progressBar1.Value = i + 1; } }); } } } } catch (Exception ex) { var eb = new ErreurBdd(); eb.ShowDialog(); LogException("errorLog", "Error", ex.Message + " - | " + DateTime.Now + " | Build: " + Application.ProductVersion + Environment.NewLine); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 private void bgw1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; metroLabel2.Text = string.Format("Chargement en cours, veuillez patienter...{0}%", e.ProgressPercentage); }
Donc voilà, en ce qui me concerne je pense qu'il est logique que le code suivant ne fonctionne pas étant donné qu'il se situe dans la boucle "While" mais alors où le placer ?
Merci,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 progressBar1.Invoke((MethodInvoker)delegate { progressBar1.Maximum = metroListView1.Items.Count;//Dt is your DataTable for (int i = 0; i < metroListView1.Items.Count; i++) { //Do Work progressBar1.Value = i + 1; } });
Cordialement.
Partager