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
Alors pour avoir tester, le goulot d'étranglement se situe au niveau de la région Style, la région Init ne pose absolument aucun problème au point de vue performance.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 private void DataGridViewPreRapport_SetColoursAndFonts(DataGridView datagrid) { datagrid.SuspendLayout(); int NombreColonnesAvantTotal = datagrid.Columns.Count-1; Rubrique CurrentRubrique = null; RubriqueLayout layout = new RubriqueLayout(); foreach (DataGridViewRow row in datagrid.Rows) { #region Init Rubrique rub=null; if (row.Tag != null) rub = (Rubrique)row.Tag; if (CurrentRubrique != rub) { CurrentRubrique = rub; layout = new RubriqueLayout(); if (CurrentRubrique.UtilisationModeleLayout) { Modele_Layout_Rubrique modele = Dossier.GetModeleLayoutRubriqueByID(CurrentRubrique.RefModele); if (modele != null && modele.Layout != null) layout = modele.Layout; } else { if (CurrentRubrique.Layout != null) layout = CurrentRubrique.Layout; } } #endregion #region Style String Cell0 = row.Cells[0].Value.ToString(); String Cell1 = row.Cells[1].Value.ToString(); if (Cell0.Equals("") && Cell1.Equals("")) // Ligne total { row.DefaultCellStyle.Font = layout.FontTotal; row.DefaultCellStyle.ForeColor = layout.ForeColorTotal; row.DefaultCellStyle.BackColor = layout.BackgroundColorTotal; } else if (Cell0.Equals("") && !Cell1.Equals("")) // Ligne header { row.DefaultCellStyle.Font = layout.FontHeader; row.DefaultCellStyle.ForeColor = layout.ForeColorHeader; row.DefaultCellStyle.BackColor = layout.BackgroundColorHeader; } else //Ligne rubrique { row.DefaultCellStyle.Font = layout.FontData; row.DefaultCellStyle.ForeColor = layout.ForeColorData; row.DefaultCellStyle.BackColor = layout.BackgroundColorData; row.Cells[NombreColonnesAvantTotal].Style.Font = new Font(layout.FontData, FontStyle.Bold); } #endregion } datagrid.ResumeLayout(); }
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 ...![]()
Partager