IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2018
    Messages : 150
    Points : 63
    Points
    63
    Par défaut 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;
            }
    Nom : Capture.PNG
Affichages : 221
Taille : 9,7 Ko

    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é
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    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
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2018
    Messages : 150
    Points : 63
    Points
    63
    Par défaut
    Bonjour et merci pour cette réponse mais dans ton code ou dois-je placer mon code "CreateDt" ??

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    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...

Discussions similaires

  1. Procédure Stockée pour créer des TABLE dynamiquement
    Par GuyverZ dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 12/05/2009, 22h29
  2. Créer un menu dynamique (appele de pages externe)
    Par pierrot10 dans le forum ASP
    Réponses: 2
    Dernier message: 28/11/2005, 08h35
  3. Créer un objet dynamiquement
    Par soad dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 08/11/2005, 14h03
  4. [DisplayTag] Créer un lien dynamique avec javascript
    Par babylone7 dans le forum Taglibs
    Réponses: 3
    Dernier message: 20/04/2005, 10h23
  5. [DisplayTag] Comment créer un lien dynamique
    Par tscoops dans le forum Taglibs
    Réponses: 3
    Dernier message: 17/02/2005, 09h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo