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 :

Problème datagridview virtualmode


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Par défaut Problème datagridview virtualmode
    Bonjour,

    Comme le titre l'induque, j'ai un problème avec un datagridview que je fais fonctionner en virtualmode.
    Le datagridview est allimenté par une vue, et les données transmisent par une fonction qui est appelée sur l'évennement OnCellValueNeeded, qui ressemble à ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private void MonDGV_CellValueNeeded(object sender, System.Windows.Forms.DataGridViewCellValueEventArgs e) {
      e.Value=MaDataView[e.RowIndex][e.ColumnIndex];
    }
    Jusque là rien de bien méchant.


    Par contre, le problème arrive lorsque je raffraichit ma vue (ou la table qui l'alimente). Ma méthode de mise à jour des données ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void MiseAJourDonnees() {
       //Je commence par "vider" le DataGridView, pour ne pas risquer d'avoir des accès à une ligne non présente dans ma nouvelle vue
       MonDGV.RowCount = 0;
     
       //définition des nouveaux filtres de ma vue... Je vous épargne les détails
       string Filtres = "Nom Like a%";
     
       //J'applique les filtres sur la vue
       MaDataView.RowFilter = Filtres;
     
       //J'indique au datagridview le nouveau nombre de lignes
       MonDGV.RowCount = MaDataView.Count;
    }
    Et mon problème arrive sur la dernière ligne : J'ai à ce moment là un appel à MonDGV_CellValueNeeded qui se produit pour CHAQUE ligne du datagridview (et pas seulement pour les lignes visibles).
    Ce qui, bien sur, à tendance à être lent, voir très lent quand la view présente 5000 lignes (cas extrème pour les tests).
    Et surtout, je perds tout l'avantage de l'utilisation du virtualmode!
    J'ai essayé d'encadrer mon code avec des MonDGV.SuspendLayout() et MonDGV.ResumeLayout(), mais ça ne change rien... D'ailleurs, j'ai toujours pas compris dans quel cas ces fonctions servent à quelque chose!

    Des idées ?

  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
    Peut-être ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonDGV.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells ;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonDGV.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None ;

  3. #3
    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
    Salut

    Quel est l'intéret du virtualmode dans ton cas ?
    D'apres ce que je vois tu pourrais simplement mettre ta dataview en datasource non ?

  4. #4
    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 : 43
    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 olibara Voir le message
    Quel est l'intéret du virtualmode dans ton cas ?
    D'apres ce que je vois tu pourrais simplement mettre ta dataview en datasource non ?
    +1

    Si pour une raison ou une autre tu tiens à rester en virtualmode, tu peux toujours te désabonner de l'évènement CellValueNeeded quand tu rafraichis la vue, et te réabonner après :
    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
    private void MiseAJourDonnees() {
     
        MonDGV.CellValueNeeded -= MonDGV_CellValueNeeded;
     
       //Je commence par "vider" le DataGridView, pour ne pas risquer d'avoir des accès à une ligne non présente dans ma nouvelle vue
       MonDGV.RowCount = 0;
     
       //définition des nouveaux filtres de ma vue... Je vous épargne les détails
       string Filtres = "Nom Like a%";
     
       //J'applique les filtres sur la vue
       MaDataView.RowFilter = Filtres;
     
       //J'indique au datagridview le nouveau nombre de lignes
       MonDGV.RowCount = MaDataView.Count;
     
       MonDGV.CellValueNeeded += MonDGV_CellValueNeeded;
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Peut-être ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonDGV.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells ;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonDGV.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None ;
    C'était exactement ça ! Merci!
    Et c'est tout à fait logique : avec un autosize sur les lignes, il est nécessaire au DGV de "voir" tout ce qu'il va y avoir dans les lignes, pour les redimensionner... d'où le parcours de toutes les lignes!


    Citation Envoyé par olibara Voir le message
    Salut

    Quel est l'intéret du virtualmode dans ton cas ?
    D'apres ce que je vois tu pourrais simplement mettre ta dataview en datasource non ?
    En fait, j'ai simplifié mon code pour l'exemple (peut être un peu trop simplifié effectivement!).
    Il y a des traitements sur les données de certaines cellules, et la durée cumullée de ce traitement dans le cas ou il y a un grand nombre de lignes n'est pas négligeable!



    Citation Envoyé par tomlev Voir le message
    +1

    Si pour une raison ou une autre tu tiens à rester en virtualmode, tu peux toujours te désabonner de l'évènement CellValueNeeded quand tu rafraichis la vue, et te réabonner après
    C'est effectivement une autre solution (qui me permettra peut-être de conserver le redimensionnement automatique des lignes... je vais essayer!)

    Merci à tous!

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

Discussions similaires

  1. [Débutant] Problème DatagridView la propriété CurrentRow
    Par kh.akram09 dans le forum VB.NET
    Réponses: 4
    Dernier message: 09/03/2012, 18h47
  2. Problème DataGridView
    Par hamzux dans le forum C#
    Réponses: 1
    Dernier message: 06/06/2007, 14h09
  3. [C#] Datagridview, dataset, etc Problème de refresh
    Par nitrous007 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 15/12/2006, 14h01
  4. [VB.NET] Problème de rafaichissement du datagridview
    Par thierry007 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/12/2006, 01h59
  5. Problème de remplissage d'un datagridview VB 2005
    Par Bam513 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/05/2006, 16h00

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