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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 38
    Points : 22
    Points
    22
    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 é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
    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.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 38
    Points : 22
    Points
    22
    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 é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
    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 ;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    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;
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 38
    Points : 22
    Points
    22
    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+

  7. #7
    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
    Le code utilisera ces instructions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // créer la DataTable
    DataTable Dt=New DataTable() ;
    Dt.Columns.Add(New DataColumn("Col0",GetType(System.String)) ;
    Dt.Columns.Add(New DataColumn("Col1",GetType(System.DateTime)) ;
    ...
    // créer et remplir  un enregistrement
    DataRow Dr=Dt.NewRow() ;
    Dr[0]="La valeur pour col0" ;
    Dr[1]=Now ; // la valeur pour col1 ;
    Dt.Rows.Add(Dr) ;
     
    // ... Binder la dataTable au DataGridView
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

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