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

VB.NET Discussion :

Optimisation remplissage DataGridView


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut Optimisation remplissage DataGridView
    J'ai besoin de remplir un DataGridView à partir d'un Dictionary "MesVar" qui contient environs 36000 données (MesVar est interne à mon appli, pas une base de donnée externe). Ces 36000 données sont réparties dans des tableaux de différentes tailles référencés par une clef alphabétique (le dictionary).

    J'utilise le code suivant qui fonctionne trés bien mais est "un peu longuet".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ' Toutes les varaibles sont affichées
    Me.DataGridViewVariables.Rows.Clear()
    ForEach kvp As KeyValuePair(OfString, EditeurSMCType.DonneesVariable()) In MesVar
    MaData = MesVar(kvp.Key)
    For i = 0 To MaData.Length - 1
     Me.DataGridViewVariables.Rows.Add(kvp.Key, i, MaData(i).Utilisee,kvp.Key & i, _
     MaData(i).Mnemo, MaData(i).Libelle, MaData(i).Valeur)
    Next i
    Next kvp
    Est-il possible d'optimiser ce code (du genre traitement par tableaux complets sans parcourir tous les éléments de chacuns des tableaux)?



    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  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 : 44
    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
    Par défaut
    Citation Envoyé par sibama Voir le message
    Est-il possible d'optimiser ce code (du genre traitement par tableaux complets sans parcourir tous les éléments de chacuns des tableaux)?
    non, tu es obligé de parcourir les tableaux, parce que le DataGridView ne saura pas comment les traiter...

    Ce que tu pourrais faire, qui serait peut-être un peu plus efficace, c'est "aplatir" tes données (les mettre sous forme d'une liste d'éléments, et non dans des tableaux contenus eux-mêmes dans un Dictionary), et définir la liste obtenue comme DataSource du DataGridView.

    Mais de toutes façons, avec 36000 éléments à afficher ce sera forcément un peu lent... à moins d'utiliser le mode virtuel, qui sert justement à ça. Tu fournis les données à la demande en gérant l'évènement CellValueNeeded.
    http://msdn.microsoft.com/en-us/libr...rtualmode.aspx

  3. #3
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut
    Dans ta deuxième boucle for, tu pourrais pas utiliser le:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With MaData(i)
    [...]
    End With
    ??

    Il me semble avoir déjà vu à quelque part que ça optimisait la vitesse d'exécution, mais je peux me tromper aussi. Je crois d'ailleurs avoir vu ça sur le site de P.Lasserre (voir ma signature)...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    je pense pas que with change grand chose niveau perf (m'enfin si c'est monsieur lasserre qui le dit, il a du tester)


    sinon avec le mode virtuel, en effet tu remplira ton datagrid de 36000 lignes en moins de 2 secondes ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Merci pour vos réponses.

    Je dois avouer qu'après avoir esayé un peu le mode virtuel, j'ai regardé comment optimiser mes variables, car en fait, pour ne pas déclarer de Hashtable, je suis obligé de créer un nombre important d'adresses de variables qui non pas d'existence réelle dans mon cas.

    J'ai donc "simplement" ajouté un flag "existe" à la structure qui me sert à définir chacune de mes variables. Je mets ce flag à jour lors de la définition de ma base de variables et j'ai transformé mon code comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Me.DataGridViewVariables.Rows.Clear()
    ForEach kvp As KeyValuePair(OfString, EditeurSMCType.DonneesVariable()) In MesVar
    MaData = MesVar(kvp.Key)
    For i = 0 To MaData.Length - 1
    If MaData(i).Existe Then
    Me.DataGridViewVariables.Rows.Add(kvp.Key, i, MaData(i).Utilisee, kvp.Key & i, _
    MaData(i).Mnemo, MaData(i).Libelle, MaData(i).Valeur)
    EndIf
    Next i
    Next kvp
    Je pense qu'il met beaucoup moins de temps pour exécuter le If supplémentaire que pour traiter le Rows.Add car la mise à jour du DataGridView en est presque "rapide".


    2 petites questions cependant:
    • A Faladin: comment voyais-tu l'utilisation du With, car vu que MaData est imbriquée avec des données non liées à MaData (kvp.key et i), et qu'il faut (sauf erreur de ma part) les "," pour séparer les champs, je vois pas. Par contre je suis d'accord avec toi sur le fait que j'ai bien lu quelque part qu'il était plus rapide de faire un With/End With que de répéter plusieures fois tout le début de la séquence. J'essaye donc de le faire systématiquement
    • A Tomlev: En supposant que j'aplatisse mes données et que je les passe en Datasource, est-il possible de faire des tris sur l'affichage du DataGridView pour n'afficher qu'une partie des données? Et de plus, si je duplique mes données (car dans le reste de mon appli, je souhaite garder cette notion de Dictionary qui marche du feu de Dieu pour ce que je cherche à en faire) est-ce que ça fait pas un peu "lourd" comme utilisation mémoire?

    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  6. #6
    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 : 44
    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
    Par défaut
    Citation Envoyé par sibama Voir le message
    Je pense qu'il met beaucoup moins de temps pour exécuter le If supplémentaire que pour traiter le Rows.Add car la mise à jour du DataGridView en est presque "rapide".


    • A Tomlev: En supposant que j'aplatisse mes données et que je les passe en Datasource, est-il possible de faire des tris sur l'affichage du DataGridView pour n'afficher qu'une partie des données? Et de plus, si je duplique mes données (car dans le reste de mon appli, je souhaite garder cette notion de Dictionary qui marche du feu de Dieu pour ce que je cherche à en faire) est-ce que ça fait pas un peu "lourd" comme utilisation mémoire?
    Tu peux utiliser une BindingSource, ce qui permet de filtrer et/ou trier les données.
    Pour ce qui est de l'utilisation mémoire, ça dépend un peu de la taille des éléments de données...

    Sinon, je persiste à penser que la meilleure solution est le mode virtuel, mais dans ton cas précis c'est un peu compliqué, car vu la structure des données ce n'est pas évident de savoir quel élément correspond à un index particulier... enfin, ce n'est pas le bout du monde, mais ça t'oblige à faire des calculs par rapport à la longueur des tableaux contenus dans le DIctionary

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplissage DatagridView avec Base Oracle
    Par Sharp93 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 23/06/2009, 10h00
  2. Réponses: 1
    Dernier message: 22/06/2009, 22h55
  3. Réponses: 17
    Dernier message: 01/04/2009, 12h58
  4. Problème remplissage datagridview
    Par callo dans le forum C#
    Réponses: 7
    Dernier message: 12/02/2008, 15h27
  5. [windev10]optimisation remplissage d'une table
    Par nath-0-0 dans le forum WinDev
    Réponses: 6
    Dernier message: 16/03/2007, 14h34

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