Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Créer un ProgressBar dynamique en WPF


Sujet :

C#

  1. #1
    Membre du Club
    Créer un ProgressBar dynamique en WPF
    Bonjour,
    Voici l'idée de mon application WPF en C# :
    Lorsque je clique sur un bouton (InsertSql_Btn), je lance une requete SQL et affiche les résultats dans un DataGrid (dt1). J'ajoute un ProgressBar (PB1) qui s'incremente au fur que la requete remonte des lignes.
    Tout fonctionne bien hormis pour le ProgressBar qui au lieu de s'incrémenter, affiche directement le nombre de ligne trouvée.
    Voici mon code :

    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
     public DataTable CreateDt(IProgress<int> progress)
            {
                using (Entities dc = new Entities())
                {
                    DataTable dt = new DataTable();
                    var query =  (from a in dc.GCARTICLE
                                 where a.ART_RUB6 == "POLYB"
                                 && a.ART_CODE.StartsWith("A3")
                                 select new
                                 {
                                     a.ART_CODE
                                 }).ToList();
     
                    DataColumn dt1 = dt.Columns.Add("ART_CODE", typeof(string));
                    DataRow dw;
                    foreach (var c in query)
                    {
                        dw = dt.NewRow();
                        dw["ART_CODE"] = c.ART_CODE;
                        dt.Rows.Add(dw);
                    }
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        progress.Report(i);
                    }
                    return dt;
                }
            }
            private async void InsertSql_Btn_Click(object sender, RoutedEventArgs e)
            {
                var progress = new Progress<int>(percent => PB1.Value = percent);
                var result = await Task.Run(() => CreateDt(progress));
                dt1.ItemsSource = result.DefaultView;
            }



    Que faut-il changer à ce code pour que le ProgressBar s'incrémente de 1 à chaque ligne crée dans le Datagrid ?

    Merci de votre aide

  2. #2
    Expert confirmé
    bonjour

    Vu la rapidité des processeurs actuels une boucle même de 100 milles enregistrements est traité en moins d'un clin d'œil.
    Aussi as-tu intérêt à simuler une "latence" artificielle et utiliser un BackgroundWorker.
    code exemple .cs :
    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
     
     public partial class Window1 : Window
        {
     
            public Window1()
            {
                InitializeComponent();
            }
     
            private void btn_Click(object sender, RoutedEventArgs e)
            {
                BackgroundWorker worker = new BackgroundWorker();
                worker.WorkerReportsProgress = true;
                worker.DoWork += worker_DoWork;
                worker.ProgressChanged += worker_ProgressChanged;
     
                worker.RunWorkerAsync();
            }
     
            private void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                int nbEnreg = 1000;
                for (int percent = 1; percent < nbEnreg; percent++)
                {
     
                    (sender as BackgroundWorker).ReportProgress(percent);
                    Thread.Sleep(100); //  /  une "latence" artificielle de 10 millisecondes (10/1000 secondes)
                }
            }
     
            void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
               this.progressBar1 .Value = e.ProgressPercentage;
            }
        }

    bon code...

  3. #3
    Membre du Club
    Bonjour et merci pour cette réponse mais dans ton code ou dois-je placer mon code "CreateDt" ??

  4. #4
    Expert confirmé
    bonjour
    Comme tu comptes les enregistrements remontés c'est ici:
    code .cs:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                DataTable  dt =CreateDt();
                int nbEnreg = 1000;
                for (int percent = 1; percent < nbEnreg; percent++)
                {
     
                    (sender as BackgroundWorker).ReportProgress(percent);
                    Thread.Sleep(100); //  /  une "latence" artificielle de 10 millisecondes (10/1000 secondes)
                }
            }

    bon code...

###raw>template_hook.ano_emploi###