|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre expérimenté
![]() Benjamin FrésonDéveloppeur .NET Inscription : février 2009 Messages : 309 ![]() |
Bonjour à tous,
Bon alors je suis face à problème d'optimisation assez gênant. Je m'expliques : J'essaye d'appliquer une mise en forme à un DataGridView, le datagridview n'est pas rempli grâce à un binding.( Les rows sont ajoutées manuellement mais ce n'est pas ça le problème dans le cas présent) Le problème est que l'application de cette mise en forme, que je faisais à la base après l'ajout des mes données, via une méthode, est très lente ! 6 secondes pour 360 lignes ... Pour expliquer un peu comment cela fonctionne, j'affiche dans mon datagridview, une liste d'objet Rubrique. L'affichage est affiché comme suit : Une ligne correspondant au header (avec le nom de la rubrique) Plusieurs lignes correspondant aux données de la rubrique Une ligne correspondant aux totaux des données. A chaque rubrique est lié une mise en forme, dans laquelle on peut modifier le style du header, des données et du total. Ce qui donne un affichage comme sur l'image jointe. Voici la méthode que j'utilises pour appliquer les mises en forme Code :
Donc à partir de là, étant un peu perdu, j'ai essayer de faire la mise en forme directement via un event du DataGridView (bien que je ne vois pas en quoi cela serait + rapide). J'ai donc utiliser ces events les un à la suite de l'autre : - RowPrePaint - RowPostPaint - CellPainting - CellFormating Mais rien n'y a fait, aucun gain de performance. Est ce le fait de modifier le DefaultCellStyle qui prend autant de temps ? Y'a t'il une autre manière de faire ? Merci de vos réactions éventuelles car la je suis relativement perdu ... |
||
|
|
00
|
|
|
#2 |
|
Membre habitué
![]() Raphael DAVIDDéveloppeur .NET Inscription : juin 2010 Messages : 62 ![]() |
Bonjour,
Je n'ai jamais testé, mais à la lecture de votre code il me vient une idée : Pourquoi ne pas affecter un DefaultCellStyle à l'ensemble des lignes du DataGridView (DataGridView.RowsDefaultCellStyle), et un DefaultCellStyle uniquement aux lignes "total" et "header" ? Cela ferait bien moin d'affectations de style. Voici un lien vers une page microsoft où est expliqué l'ordre dans lequel les styles sont appliqués : http://msdn.microsoft.com/fr-fr/library/1yef90x0.aspx |
|
|
00
|
|
|
#3 |
|
Membre expérimenté
![]() Benjamin FrésonDéveloppeur .NET Inscription : février 2009 Messages : 309 ![]() |
Bonjour,
malheureusement je ne peux pas car chaque rubrique a une mise en page différente. Comme on peut le voir sur l image, chaque rubrique est affichée à la suite l'une de l'autre. |
|
|
00
|
|
|
#4 | ||
|
Membre habitué
![]() Raphael DAVIDDéveloppeur .NET Inscription : juin 2010 Messages : 62 ![]() |
Selon un article de Microsoft (http://msdn.microsoft.com/fr-fr/libr...cellstyle.aspx) il y a instanciacion automatique d'un nouveau DataGridViewCellStyle à chaque lecture de celui-ci. Probablement 360 fois dans votre cas. Peut être qu'en préparant ces styles à l'avance, vous pourriez controler (et limiter) le nombre d'instanciation de style. Y a-t-il une amélioration en tournant le code de la manière suivante ?
Code :
|
||
|
|
10
|
|
|
#5 |
|
Membre expérimenté
![]() Benjamin FrésonDéveloppeur .NET Inscription : février 2009 Messages : 309 ![]() |
Alors je viens de tester ta solution et j'ai effectivement un gain de temps fortement appréciable.
Je passes de 6 secondes à 2.7, ce qui est loin d'être négligeable Donc déjà un grand merci à toi pour cette solution. Mais je trouves que cela reste encore très long pour 300 lignes :/ Je me demandes ce qui continue à prendre encore autant de temps ! |
|
|
00
|
|
|
#6 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2006 Messages : 4 717 ![]() |
Citation:
Je pense qu'on gagnerait nettement en créant les différents styles au départ et en les affectant aux cellules sur l'event CellFormatting.
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson |
|
|
|
10
|
|
|
#7 | ||||||||
|
Membre expérimenté
![]() Benjamin FrésonDéveloppeur .NET Inscription : février 2009 Messages : 309 ![]() |
J'ai testé ta solution graffito et en effet cela semble bien fonctionner
J'ai utiliser 3 Dictionary pour stocker mes différents styles. J'ai été contraint d'en utiliser 3 quoi car pour chaque rubrique, j'ai 3 styles différents a chaque fois, et si je les mettais tous dans un même Dictionary, impossible de savoir quel est le style header, total ou data ... Pour ceux que ça intéresse voici, en simplifié ce qui est fait : Code :
Code :
Code :
Code :
Mais je ne sais pas si je vais vraiment y gagner au niveau performance ? Avez vous des remarques sur ma manière de faire ? Merci d'avance ! |
||||||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com