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 :

Extrême lenteur mise à jour cellule DataGridView


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 728
    Par défaut Extrême lenteur mise à jour cellule DataGridView
    Bonjour,

    Voilà que je fais face à un souci, et que je n'en comprends pas la raison.
    Donc, si quelqu'un a déjà rencontré ce problème et a trouvé une solution...

    J'ai une DataGridView, qui pour certaines sélections, et pour une bonne raison affiche plus de 6000 enregistrements.
    Pas question de faire du paging ou de limiter la sélection dans ce cas précis, puisque c'est justement pour faire un traitement de masse sur les cellules.

    Jusqu'à présent tout se passait bien, et on pouvait affecter des valeurs à une ou plusieurs colonnes pour l'ensemble des lignes en une ou deux secondes.
    Mais brusquement (impossible de dire depuis quand, on se sert rarement de cette partie), et je ne sais pour quelle raison, c'est devenu "escargotesque". Il met 10s à traiter 100 lignes, vous imaginez pour 6000...
    J'ai envisagé plusieurs possibilités.
    Une mise à jour récente de mon Visual Studio 2017 Entreprise, qui aurait cassé quelque chose.
    Le passage récent du projet en .net Framework 4.7.2 au lieu de 4.6.1.
    Une mise à jour récente de Windows 10.
    Un nombre d'enregistrements qui a passé un seuil.

    Précisions :
    La DatagGridView est DoubleBuffered, le redimensionnement des colonnes désactivé, et j'ai même essayé en masquant la DataGridview avant la boucle de mise à jour des cellules.
    La boucle dans laquelle un champ (le plus souvent une date) est mit à jour se fait par un : For Each row As DataGridViewRow In myDGV.SelectedRows

    Merci

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    La MAJ de Windows 10 et Visual studio et le passage de 4.6 à 4.7 ne devraient pas changer grand chose.
    Attention toutefois car la dernière version maintenue de .Net Framework est la 4.8. S'il y a un souci, il ne sera pas corrigé en 4.7.

    Pour le nombre d'enregistrement, je ne sais pas.
    Mais c'est une sacré différence que tu observes.
    Le nombre seul n'explique pas un tel comportement à moins que ce nombre ait également été décuplé.

    Le REDRAW pourrait causer ce genre de souci.
    Mais dans la mesure où ça le fait également lorsque tu masques la grille, cela ne doit pas être ça.

    N'y aurait-il pas un calcul effectué lors la modification d'une valeur (genre un cumul, ou le calcul d'une durée) ?

  3. #3
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 728
    Par défaut
    Bonjour Popo,

    Non, aucun calcul, juste le remplacement d'une date de renouvellement.
    J'ai même désactivé la routine qui gérait l'événement CellValueChanged au cas où, rien n'y fait.

    Pour le framework, hier soir j'ai rebasculé une copie du projet en 4.6.2, et j'observe le même problème, çà ne vient donc pas de là.
    Dans cette copie, j'ai tenté de mettre à jour une autre colonne (ou est affiché un simple float), celle avec la date étant un peu spécifique (classe spéciale date_Column dérivée de DataGridViewColumn avec un DateTimePicker). Mais le résultat est le même.
    J'ai noté par ailleurs, que la simple boucle For Each, sans rien faire dans cette boucle met près de 4s, ce qui n'est pas vraiment normal.

    Et le pire, c'est que j'ai un autre formulaire, de mise à jour de masse, encore plus gros, 3 fois plus de colonnes, plus de 28000 enregistrements affichés, et le même traitement, pourtant beaucoup plus lourd, car bardé de tests, de réaffectation de valeurs dans des combobox, etc... ne met que 20s pour tout passer en revue.

    je penche donc pour quelque chose dans le contrôle DataGridView lui-même, qui me fout la pagaille, mais quoi ?

  4. #4
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 728
    Par défaut
    Rectification !
    Après relecture, je m'aperçois que le test effectué en changeant la valeur d'une autre colonne était biaisé, cette colonne étant d'une classe spéciale également.
    J'ai refait le test avec une colonne textbox standard, et là on est revenu aux temps habituels (les 4 secondes sont dus au traitement plus le recalcul des tailles des colonnes du contrôle DataGridView).

    Mon problème vient donc de la classe.
    Reste à trouver ce qui ralentit autant le traitement dans ces classes héritées.

  5. #5
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 728
    Par défaut
    Histoire de trouver ce qui cloche, j'ai fait le ménage dans la classe et je n'ai laissé que l'essentiel.
    Et pourtant j'ai toujours le même problème de lenteur
    Voilà ce qui reste (plus grand chose), dans la classe :
    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
    Public Class date_Column
     
        Inherits DataGridViewColumn
     
        Public Sub New()
            MyBase.New(New date_Column_Cell)
        End Sub
     
    End Class
     
    Public Class date_Column_Cell
     
        Inherits System.Windows.Forms.DataGridViewTextBoxCell
     
    End Class
    J'en viens à me dire qu'il y a un problème sur le traitement des classes héritées

  6. #6
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 728
    Par défaut
    Çà y est je l'ai eu !
    Et c'était une petite bêtise mais avec de graves conséquences.
    Une personne avait rajouté lors du remplacement des colonnes du contrôle DataGridView par les nouvelles colonnes liées à la classe, un AutoSizeMode sur ces colonnes définit sur DataGridViewAutoSizeColumnMode.AllCells
    Chose que nous ne faisons jamais.
    Une fois sur NotSet et ce paramètre géré au niveau DataGridView, j'ai retrouvé le comportement "normal". Ouf !

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

Discussions similaires

  1. problème de mise à jour au datagridview
    Par najoua01 dans le forum VB.NET
    Réponses: 28
    Dernier message: 09/10/2010, 16h23
  2. Mise à jour cellule macro perso
    Par pascalouh dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/06/2009, 10h02
  3. Mise à jour ligne DataGridView trié
    Par aure298 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/10/2008, 16h03
  4. Mise à jour de datagridview
    Par gazier20 dans le forum Accès aux données
    Réponses: 3
    Dernier message: 03/12/2007, 15h15
  5. [C# 1.1] Mise à jour cellules dans un datagrid
    Par celos dans le forum Windows Forms
    Réponses: 10
    Dernier message: 14/06/2006, 09h26

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