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 :

remplissage d'un DatagridView très lent


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 38
    Par défaut remplissage d'un DatagridView très lent
    Salut,

    Je rempli un DatagridView à partir d'un fichier XML. Avec moins de 100 lignes et 10 colonnes pas de problème.
    Mais à 1000, 1500 lignes cela devient très lent.
    Ci joint le code qui me permet de remplir mon dtgv :

    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
                   while (reader.Read())
                   {
                       if (reader.Name.Equals("Lignes"))
                       {
                           node = doc.ReadNode(reader);
                           int ligne = 1;
                           int numLigne = Int32.Parse(node.Attributes.GetNamedItem("nombre").Value);
                           int nbcol = 0;
    
                           this.Rows.Add(numLigne);
    
                           foreach (XmlNode Fils in node.ChildNodes)
                           {
                                if (Fils.Name.Equals("Ligne"))
                               {
                                   this.Rows[ligne - 1].Cells[0].ToolTipText = "1";
                                   this.Rows[ligne - 1].Cells[1].ToolTipText = ligne.ToString();
                                  foreach (XmlNode ligneNode in Fils.ChildNodes)
                                   {
                                        int colonne = Int32.Parse(ligneNode.Attributes.GetNamedItem("index").Value);
                                        String valeur = ligneNode.Attributes.GetNamedItem("valeur").Value.ToString() ;
                                            if (valeur != "null")
                                            {
                                                valeur = valeur.Replace("\\Ampersand", "&");
                                                this.Rows[ligne - 1].Cells[colonne].Value = valeur;
                                            }
                                   }
                                   ligne = ligne + 1;
                               }
                               else MessageBox.Show("Nom de noeud inconnu : " + reader.Name);
                           }
                       }
                   }
                   reader.Close();
    Cela marche très bien jusqu'à qq centaines de lignes. J'ai profilé le code et visiblement ce qui prend du temps c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Rows[ligne - 1].Cells[colonne].Value = valeur;
    Comment peut 'on accélérer les choses ?
    Par avance merci de votre aide.

  2. #2
    Expert confirmé 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
    Par défaut
    Bonjour,

    On peut peut-être résoudre le problème en encadrant le code par un MyDataGridView.SuspendLayOut() et un MyDataGridView.ResumeLayOut().

    Je préconiserai toutefois de charger l'XML dans un DataTable, et à la fin du chargement de "binder" le DataTable avec le DataGridView via un BindingSource.

    Cela permet (entre autres avantages) d'utiliser les propriété Filter et Sort du BindingSource pour filtrer/trier le DataGridView.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 38
    Par défaut
    Merci de ta réponse.
    Concernant le SuspendLayOut j'ai déjà fait, cela encadre le code que j'ai mis en exemple et ça ne change pas grand chose.
    Concernant DataTable je n'ai pas encore essayé, j'ai un problème de base pour cela car non seulement j'utilise les valeurs (this.Rows[ligne - 1].Cells[colonne].Value = valeur mais j'utilise aussi beaucoup les tooltip associés aux valeurs lorsque je veux signifier des valeurs en erreur. Est-il possible d'associer les tooltip au daTable ? ou est-il possible de remplir le dataTable en affectant les tooltip aux cases du DataGridView ?
    A+
    Merci d'avance

  4. #4
    Expert confirmé 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
    Par défaut
    On peut utiliser l'event CellFormating du DataGridview pour ajouter (si cela n'est pas encore fait le tooltip à une cellule).

    Pour connaitre la correspondance entre la Row courrante du DataGridView et la Row de la DataTable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DataRow La_Row_de_la_DataTable=(DataRow)MyDataGridView.BindingSoure.Current ;

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Pour connaitre la correspondance entre la Row courrante du DataGridView et la Row de la DataTable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DataRow La_Row_de_la_DataTable=(DataRow)MyDataGridView.BindingSoure.Current ;
    Et d'une maniere plus générale (je le mentionne car c'est le genre de casting a faire des noeud dans son mouchoir)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataRow cRow = ((DataRowView)MyDataGridView.Rows[n].DataBoundItem).Row;

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 38
    Par défaut
    Je n'arrive pas pour l'instant à mettre en oeuvre la solution que vous m'indiquez. Pouvez vous remettre ça dans le contexte du bout de code que j'ai mis en exemple au départ. De façon à ce que je comprenne mieux et comment remplir le dataTable dans la même boucle qui met des tooltips dans les case correspondantes du DataGridView ?
    Par avance merci.
    A+

Discussions similaires

  1. BDD sur réseau très très très lent...
    Par ericain dans le forum Access
    Réponses: 12
    Dernier message: 20/02/2015, 17h17
  2. [C#2.0]Datagridview très lent à s'afficher
    Par doudoustephane dans le forum Windows Forms
    Réponses: 8
    Dernier message: 30/06/2007, 15h48
  3. Ouverture et fermeture de base très lent...
    Par Tofdelille dans le forum Installation
    Réponses: 6
    Dernier message: 19/09/2006, 18h51
  4. [Lomboz] Editeur jsp très lent
    Par lr dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 29/01/2005, 19h43
  5. SQL Server trés lent
    Par arwen dans le forum MS SQL Server
    Réponses: 18
    Dernier message: 07/11/2003, 14h45

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