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

Windows Forms Discussion :

DataGridView : Critères de mise à jour


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 41
    Points : 31
    Points
    31
    Par défaut DataGridView : Critères de mise à jour
    Bonjour à tous,

    j'ai un DataGridView qui se remplit à l'aide d'un Thread qui lui envoit des messages (eux-mêmes lus dans une base SQL Server), et chaque message possède un statut (0, 1, 2 ou 3).
    J'aimerais pouvoir afficher un seul statut, ou bien une combinaison de status, ou bien tous les status en même temps, avec un système de CheckBox simple.
    J'ai donc créé une boucle qui parcourt toutes lignes de mon DataGridView une par une (foreach... for... etc.), et pour chaque ligne je fais tout bêtement un test sur le statut et une mise à jour (Visible=false).
    Le soucis est que c'est extrêment long ! De l'ordre de 20 secondes pour traiter 150 lignes... Alors que mon appli est censée pouvoir traiter des milliers de lignes à la fois (jusqu'à environ 100 000) !
    Si vous aviez une idée ou un conseil à me donner pour accélérer mon traitement... genre une requête UPDATE Statut ...

    Thanks

    Olivier

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    ton DataGridView est bindé aux données d'un DataSet ? dans ce cas le plus simple est d'utiliser une DataView avec un filtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataView view = new DataView(dataSet1.Tables["table1"], "statut = 1", null, DataRowViewState.CurrentRows);
    dataGridView1.DataSource = view;
    Ou si tu utilises une BindingSource (c'est le cas si tu as défini le binding en mode design) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table1BindingSource.Filter = "statut = 1";
    Si tu n'utilises pas le data binding et que tu ajoutes les lignes manuellement au DataGridView, je te suggère de changer ça... Avec le binding, le filtrage est très rapide (pour 150 lignes ce sera virtuellement instantané)

  3. #3
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut
    Juste pour info au cas où tu es obligés de remplir ta grille manuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                for (int i = 0; i < 10000; i++)
                {
                    dataGridView1.Rows.Add("mdsqlkfj", "qdsfqdfj", "qsdmlkfjqsd", "ezuâiporut", "w:xc,;vnxcw");
                }
    Temps d'exécution, environ une demi secondes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                DataGridViewRow[] dgvr = new DataGridViewRow[10000];
                for(int i = 0; i < 10000; i++) {
                    dgvr[i] = new DataGridViewRow();
                    dgvr[i].CreateCells(dataGridView1, "mdsqlkfj", "qdsfqdfj", "qsdmlkfjqsd", "ezuâiporut", "w:xc,;vnxcw");
                }
                dataGridView1.Rows.AddRange(dgvr);
    Temps d'exécution, environ >17 secondes.

    La durée est mesurée sur la machine où j'ai fais le teste

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Merci pour vos réponses.

    Je suis effectivement obligé de remplir mon DataGridView manuellement, car les tables dans lesquelles je vais chercher mes données sont très dynamiques, puisque plusieurs centaines de lignes sont ajoutées chaque heure...
    Le problème n'est en fait pas de remplir mon DataGridView (ce qui se fait rapidement...) mais de mettre à jour son affichage en fonction des statuts que je veux voir.
    Par exemple, si j'ai 10 000 lignes, dont 2500 en statut 2, et que je veux voir tout sauf statut 2, j'obtiendrai, comme tout le monde l'a deviné, 7500 lignes . Plus concrètement, existe-t-il un moyen (un ami m'a parlé du mode Virtuel des DataGridView, mais j'ai du mal à en comprendre le principe et l'implémentation) permettant de n'afficher que certaines lignes, en fonction d'un critère donné ?

    Merci encore pour votre aide

  5. #5
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par djunityfr Voir le message
    Je suis effectivement obligé de remplir mon DataGridView manuellement, car les tables dans lesquelles je vais chercher mes données sont très dynamiques, puisque plusieurs centaines de lignes sont ajoutées chaque heure...
    Ca ne t'oblige pas à remplir directement la grille. Tu peux créer une DataTable, dans laquelle tu mets ces données, issues de ces "tables dynamiques" ; après, tu bindes la grille à cette dataTable, et tu peux alors filtrer, trier, etc. sans manipuler directement les collections de lignes, juste en spécifiant des critères de tri ou de filtre.
    ಠ_ಠ

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    D'accord, donc concrètement, à chaque boucle de mon Thread, j'insère les données récupérées dans une DataTable, que j'affecte ensuite à la DataSource de mon DataGridView ?
    Avant que je ne teste, le fait de remplir une DataTable très régulièrement (au moins toutes les secondes disons) ne risque pas de poser problème niveau mémoire et/ou CPU ?

    Merci d'avance... ensuite je vous laisse tranquilles

  7. #7
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par djunityfr Voir le message
    D'accord, donc concrètement, à chaque boucle de mon Thread, j'insère les données récupérées dans une DataTable, que j'affecte ensuite à la DataSource de mon DataGridView ?
    Yep, sauf que lier la table à la grille ne doit être fait qu'une fois (dans le constructeur de ta form, par exemple). Après, par la magie du binding, toute modif apportée à la table se répercute graphiquement immédiatement dans la grille.
    Citation Envoyé par djunityfr Voir le message
    Avant que je ne teste, le fait de remplir une DataTable très régulièrement (au moins toutes les secondes disons) ne risque pas de poser problème niveau mémoire et/ou CPU ?
    En tous cas ce sera pas pire qu'avant, où tu modifiais directement le contenu de la grille à cette fréquence
    ಠ_ಠ

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Par contre fais gaffe, je pense que si tu ajoutes des données à la DataTable à partir d'un autre thread, alors que le DGV est bindé dessus, ça va péter (à moins que le système de binding ne gère cet aspect, mais ça m'étonnerais). Il faut donc effectuer cette opération sur le thread principal, via la méthode Invoke

Discussions similaires

  1. Recherche avec plusieurs critères et mise à jour automatique
    Par emowpya dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/02/2013, 17h36
  2. [DATAGRIDVIEW] Remplissage et mise à jour.
    Par GarsDuCalvados dans le forum VB.NET
    Réponses: 5
    Dernier message: 11/04/2009, 17h59
  3. Réponses: 2
    Dernier message: 06/06/2008, 14h27
  4. Réponses: 7
    Dernier message: 30/08/2006, 15h38
  5. [C# 2.0] Mise à jour d'un DataGridView via le binding
    Par oodini dans le forum Windows Forms
    Réponses: 5
    Dernier message: 01/07/2006, 22h08

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