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

C# Discussion :

[datagridview] problème de lenteur dès liaison avec datasource


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Par défaut [datagridview] problème de lenteur dès liaison avec datasource
    Bonjour

    Suite à mon code ci-dessous
    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
                    OdbcCommand dataSQL = new OdbcCommand(macommande, GO_Init.conn);
    
                    OdbcDataReader read = dataSQL.ExecuteReader();
    
                    DataSet ds = new DataSet();
                    DataTable dt = new DataTable("Table1");
    
                    ds.Tables.Add(dt);
    
                    dt.Clear();
                    ds.Tables[0].Clear();
                    DBG_LAgents.DataSource = null;
    
                    DBG_LAgents.AutoGenerateColumns = false;
                    DBG_LAgents.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
    
                    ds.Load(read, LoadOption.PreserveChanges, ds.Tables[0]);
    
                    Cursor.Current = Cursors.WaitCursor;
    
                    DBG_LAgents.SuspendLayout();
                    DBG_LAgents.DataSource = ds.Tables[0];
                    DBG_LAgents.ResumeLayout();
    
                    Cursor.Current = Cursors.Default;
    la ligne rouge me met environ 10 secondes pour m'afficher 1700 lignes environ dans le datagridview (DBG_LAgents).

    Je reprends en fait une vieille appli VB5 (qui tourne encore à l'heure où je vous parle chez des clients) pour l'écrire en C#.
    La requête utilisée est une procédure stockée qui met moins d'une seconde à s'afficher dans l'analyseur de requête (sql server 2008 R2) et qui met moins de deux secondes dans VB5 (lié à un truedbgrid, d'où le nom du tableau DBG_LAgents, je garde les mêmes noms d'objets entre le code VB et c#).

    J'ai vu qu'on pouvait utiliser le mode virtual du datagridview, mais j'avoue ne rien y comprendre à cette méthode.
    Quand aux suspendlayout et resumelayout, rien y fait.

    Merci pour votre aide bienvenue.

  2. #2
    Membre éclairé Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Par défaut
    Re bonjour

    J'ai ajouté une ligne et déplacé une autre dans mon code, et j'ai gagné quasi 7 secondes au chargement de mon tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                    
    DBG_LAgents.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; //nouvelle ligne
    
                    ds.Load(read, LoadOption.PreserveChanges, ds.Tables[0]);
    
                    Cursor.Current = Cursors.WaitCursor;
    
                    DBG_LAgents.SuspendLayout();
                    DBG_LAgents.DataSource = ds.Tables[0];
                    DBG_LAgents.ResumeLayout();
    
     DBG_LAgents.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); //déplacement
    Code Designer : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
                // DBG_LAgents
                // 
                this.DBG_LAgents.AllowUserToAddRows = false;
                this.DBG_LAgents.AllowUserToDeleteRows = false;
                this.DBG_LAgents.AllowUserToResizeColumns = false;
                this.DBG_LAgents.AllowUserToResizeRows = false;
                dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(203)))), ((int)(((byte)(216)))), ((int)(((byte)(252)))));
                this.DBG_LAgents.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;
                this.DBG_LAgents.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right)));
                this.DBG_LAgents.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
                this.DBG_LAgents.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
                this.DBG_LAgents.BackgroundColor = System.Drawing.SystemColors.Control;
                this.DBG_LAgents.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
                this.DBG_LAgents.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.Disable;
                dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
                dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(119)))), ((int)(((byte)(38)))), ((int)(((byte)(111)))));
                dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                dataGridViewCellStyle2.ForeColor = System.Drawing.Color.WhiteSmoke;
                dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
                dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
                dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
                this.DBG_LAgents.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle2;
                this.DBG_LAgents.ColumnHeadersHeight = 24;
                this.DBG_LAgents.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
                this.DBG_LAgents.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
                this.matricule,
                this.nom,
                this.prenom,
                this.centre,
                this.grade,
                this.code_postal,
                this.localite,
                this.nb_lignes});
                this.DBG_LAgents.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
                this.DBG_LAgents.EnableHeadersVisualStyles = false;
                this.DBG_LAgents.Location = new System.Drawing.Point(21, 172);
                this.DBG_LAgents.MultiSelect = false;
                this.DBG_LAgents.Name = "DBG_LAgents";
                this.DBG_LAgents.RowHeadersVisible = false;
                dataGridViewCellStyle3.ForeColor = System.Drawing.Color.Black;
                this.DBG_LAgents.RowsDefaultCellStyle = dataGridViewCellStyle3;
                this.DBG_LAgents.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
                this.DBG_LAgents.Size = new System.Drawing.Size(1187, 600);
                this.DBG_LAgents.TabIndex = 18;

    Cela dit, j'arrive toujours à deux secondes de chargement, ce qui me paraît encore un peu excessif.

  3. #3
    Membre éclairé Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Par défaut
    J'ai retiré ces deux lignes du code designer de ma form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                this.DBG_LAgents.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
                this.DBG_LAgents.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
    et ai laissé les deux lignes en vert dans le code c#

    Je gagne encore un peu de temps, et approche d'un temps de chargement "convenable".

    Je passe le topic en résolu, mais si jamais vous avez tout de même quelque chose à me proposer, je suis preneur.

  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
    Supprime cette ligne qui est inutile si la hauteur des lignes est fixe (cas général)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.DBG_LAgents.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;

  5. #5
    Membre éclairé Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Par défaut
    merci pour la réponse, mais j'avais déjà supprimé cette ligne (voir commentaire juste au-dessus )

    Y'a t'il des exemples/tutos simples pour passer le datagridview en mode virtuel ?

    J'ai les exemples msdn, mais je n'arrive pas à les comprendre .
    http://msdn.microsoft.com/fr-fr/libr...code-snippet-1

  6. #6
    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
    Si les tables ne contiennent pas d'images, passer en mode virtuel n'est pertinent que pour des tables contenant quelques centaines de millers d'enregistrements.

    Pour la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBG_LAgents.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); //déplacement
    Tu l'as apparement seulement déplacée du designer vers le code de laForm.

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

Discussions similaires

  1. problème de lenteur avec BO
    Par darwini dans le forum Débuter
    Réponses: 2
    Dernier message: 13/04/2007, 15h08
  2. [Data] problème avec dataSource
    Par linniesurf dans le forum Spring
    Réponses: 5
    Dernier message: 02/03/2007, 12h38
  3. Problème à la liaison avec LMDTools SE et Builder 2006
    Par Bodom-Child dans le forum C++Builder
    Réponses: 2
    Dernier message: 09/02/2007, 16h11
  4. Problème de lenteur avec 2 sous-formulaires
    Par picatchou dans le forum Access
    Réponses: 1
    Dernier message: 29/01/2007, 09h48
  5. Réponses: 1
    Dernier message: 24/01/2007, 17h00

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