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 :

Rapidité de tri sur Datagridview


Sujet :

Windows Forms

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Rapidité de tri sur Datagridview
    Bonjour,

    J'ai un contrôle DataGridView que j'alimente "manuellement" par le code d'environ 30000 lignes sur 6 colonnes. Ce DataGridView est présenté à l'exécution avec les entêtes de colonnes qui sont triables (asc&desc).
    Cependant, j'ai un gros problème de performance quant à la rapidité du tri des colonnes de ce DataGridView (lancé en cliquant sur l'entête d'un colonne).
    En effet, pour une colonne contenant des éléments chiffrés, le tri est très rapide, par contre avec une colonne contenant uniquement du texte (et d'autant plus si le texte est court, par exemple 1 lettre seulement), le tri est très très long.

    Je ne comprends vraiment pas pourquoi. Pouvez vous m'éclairer sur ce point?

    Merci d'avance

    J'utilise le Framework.net 2.0

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    qu'appelle tu très très long ? (au dessus 5 secondes sur un dual core pour 30k lignes on peut considérer que c'est long je pense)
    tu es en virtualmode sur dgv ?
    comment fais tu le tri ?
    j'ai entendu des rumeurs disant que le fx3.5 améliorait les perfs du dgv (bien que j'y crois pas trop)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    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
    Il faudrait que tu nous montre le code pour qu'on puisse t'aider.

    Sinon, regarde si tu ne peux pas plutôt utiliser le DataGridView en databinding, c'est plus rapide en général

    Citation Envoyé par Pol63 Voir le message
    j'ai entendu des rumeurs disant que le fx3.5 améliorait les perfs du dgv (bien que j'y crois pas trop)
    Je ne pense pas que ce soit autre chose qu'une rumeur : l'assembly System.Windows.Forms du framework 3.5 est toujours en 2.0.0.0...

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    c'est bien ce qui fait que j'y crois pas trop oui ^^

    sinon, pour avoir des perfs sur un datagrid, il ne faut utiliser ni dataset ni datatable
    donc que le binding apporte des perfs sachant qu'il nécessite un dataset j'y crois pas trop
    remplir un dataset de 30k lignes c'est infini déjà ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    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
    Citation Envoyé par Pol63 Voir le message
    sinon, pour avoir des perfs sur un datagrid, il ne faut utiliser ni dataset ni datatable
    Ah ? qu'est-ce qui te fait dire ça ? Au boulot je travaille sur une appli où on a des DataTable de plusieurs milliers (voire dizaines de milliers) de lignes, affichés dans des DataGridView et autres grilles, et il n'y a aucun problème de perf (du moins en ce qui concerne le tri...)

    Citation Envoyé par Pol63 Voir le message
    donc que le binding apporte des perfs sachant qu'il nécessite un dataset j'y crois pas trop
    Tu n'as pas besoin d'un dataset, tu peux très bien faire un binding sur une collection d'objets... Par contre là où ça se corse, c'est que pour supporter le tri il faut implémenter IBindingList. La classe BindingList<T> implémente IBindingList, mais sans gérer le tri... par contre on trouve des implémentations de BindingList triables sur le net.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ca remonte à loin mais quand on est passé sur .net on a utilisé un datatable pour un usercontrol datagrid et en c'etait plus lent que vb6 ...
    on est passé par une collections de collections (ligne et colonnes) et ca allait entre 5 et 20 x plus vite à extraire les données ...
    vu que ca remonte à loin on avait ptete écrit des conneries, m'enfin à l'époque on voyait des tas de gens venant de vb6 se plaindre que le datagridview était 10x plus lent qu'un dbgrid de vb6

    EDIT : je viens de refaire le test, remplissage d'un datatable (manuellement ou par dataadapter) : 300ms, remplissage d'une collection 150ms
    (pour la meme requete, suite à plusieurs exécutions pour le temps de mise en cache d'sql server et JIT)
    c'est moins énorme mais ca reste conséquent (et réciproquement ^^)
    (le reste du temps qu'on avait gagné (parce que là c'est que x2) c'est sur le virtualmode à priori (qui donc amène énormément aussi))
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Voilà comment je procède:

    Ci-joint la base TEST.MDB dans le zip qui contient une table TEST avec 2 champs MONTANT et LETTRE.

    Création d'une DataTable (alimentée par la table TEST)
    Appel d'une procédure pour alimenter le DataGridView avec la DataTable (oui je n'utilise pas la propriété DataSource du DataGridView):

    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
    Public Sub PutDGW(ByRef dGW As DataGridView, ByRef DT As DataTable)
     
            dGW.DataSource = Nothing
            dGW.Rows.Clear()
            dGW.Columns.Clear()
     
            Dim Ligne As DataRow
            Dim Col As DataColumn
     
            For Each Col In DT.Columns
                dGW.Columns.Add(Col.ColumnName, Col.Caption)
            Next Col
     
            Dim i As Integer = 0
     
            If (DT.Rows.Count > 0) Then dGW.Rows.Add(DT.Rows.Count) Else Exit Sub
     
            If (dGW.Columns.Count > 0) Then
                For Each Ligne In DT.Rows
     
                    For Each Col In DT.Columns
                        If (Ligne.RowState <> DataRowState.Deleted) Then
                            dGW.Rows(i).Cells(Col.ColumnName).Value = Ligne.Item(Col.ColumnName)
                        End If
                    Next Col
     
                    i = i + 1
     
                Next
            End If
     
    End Sub
    Au final, le tri sur la colonne MONTANT est très rapide, par contre le tri sur la colonne LETTRE est très très long.
    Fichiers attachés Fichiers attachés

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    j'ai entendu des rumeurs disant que le fx3.5 améliorait les perfs du dgv (bien que j'y crois pas trop)...
    Je ne pense pas que ce soit autre chose qu'une rumeur : l'assembly System.Windows.Forms du framework 3.5 est toujours en 2.0.0.0...
    Et pourtant, cela a résolu des problèmes chez moi (et aussi chez au moins un autre qui a upgradé son FrameWork suite à une discussion sur le forum à ce sujet).
    Je n'ai pas d'explication logique, c'est juste un retour d'expérience.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    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
    Citation Envoyé par MystSith Voir le message
    (oui je n'utilise pas la propriété DataSource du DataGridView)
    Ben essaie de l'utiliser justement... ça n'a pratiquement que des avantages par rapport au remplissage "manuel" du DGV

    Citation Envoyé par MystSith Voir le message
    Au final, le tri sur la colonne MONTANT est très rapide, par contre le tri sur la colonne LETTRE est très très long.
    Ben oui mais tu nous as toujours pas montré le code du tri... (non, je ne téléchargerai pas ton zip : poste directement le code si tu veux qu'on regarde)

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Il n'y a pas de code "perso" du tri... le tri est fait en automatique en cliquant avec la souris sur l'entête de la colonne du DataGridView.

    Je viens de tester avec la propriété DataSource du DataGridView et là le tri est rapide sur les 2 colonnes.

    Je ne comprends vraiment pas pourquoi sauf à ce que le tri via la DataTable soit plus performant que le tri du DataGridView, le contenu du DataGridview restant le même une fois chargé.

    Effectivement, je peux toujours mettre à jour le framework, on ne sait jamais

  11. #11
    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
    Citation Envoyé par MystSith Voir le message
    Je ne comprends vraiment pas pourquoi sauf à ce que le tri via la DataTable soit plus performant que le tri du DataGridView, le contenu du DataGridview restant le même une fois chargé.
    Parce que quand tu utilises le databinding, le tri se fait au niveau de la source de données, qui est optimisée pour ça. En mode "manuel", il faut récupérer les valeurs de chaque cellule, et c'est long... Par contre je ne saurais pas expliquer pourquoi une colonne se triait vite et l'autre non...

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/02/2008, 16h50
  2. [C# 2.0] Glyphe de tri sur un DataGridView
    Par StormimOn dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/09/2007, 12h25
  3. Enlever le tri sur une DataGridView
    Par Contrec dans le forum C#
    Réponses: 13
    Dernier message: 09/07/2007, 09h04
  4. Problème d'activation du tri sur un datagridView
    Par 2020 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 05/07/2007, 14h51
  5. [C#] Tri sur DataGridView
    Par Actarion dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/08/2006, 13h52

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