Chargement d'une ListView à l'aide d'un BackgroundWorker - SQL.
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 :
Code:
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 DoWork du BackgroundWorker AVEC le code de la ProgressBar que j'ai tenté d'essayer, sans succès :
Code:
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);
}
} |
Le ProgressChanged du BackgroundWorker :
Code:
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 ?
Code:
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;
}
}); |
Merci,
Cordialement.