Developpez.com - Microsoft DotNET
X

Choisissez d'abord la catégorieensuite la rubrique :


LameGrid Beta 1.2

Attention : Je n'aurai pas accès à ma messagerie du lundi 16/05 au lundi 23/05. Donc si vous n'avez pas de réponse à vos mails d'ici là...c'est normal.

Télécharger la version beta 1.2 de LameGrid     Pour la page principale de LameGrid c'est ICI

Date de publication : 14/05/2005 , Date de mise a jour : 14/05/2005

Par Christophe HOLMES (kikos31.developpez.com)
 

LameGrid version beta 1.2 : Attention cette version est susceptible de contenir des bugs.

Les exemples de codes suivants seront donnés alternativement en VB.NET et en C#. Il sont suffisament simples pour être transposables aisément de l'un à l'autre.

1. Etat des lieux
2. Optimisations
3. Les types
4. Les Styles
5. L'évènement CellRowColChange
6. Support des images


1. Etat des lieux

Ces derniers temps j'ai fait pas mal de tests pour faire évoluer LameGrid. Toujours dans l'idée de ne pas transformer le contrôle en usine à gaz, j'essaie de trouver le bon compromis entre les fonctionnalités et la simplicité.

Pour cette beta publique je n'ai laissé que les fonctionnalités que je pense stables et que je suis sûr de garder.

Je remercie par avance ceux qui voudront bien faire quelques essais avec cette version. N'hésitez pas à me faire part de vos idées et souhaits, à défaut vous pouvez aussi me laisser un petit mot d'encouragement ( j'en profite pour remercier ceux qui l'on déjà fait ).

Dans l'ensemble, les fonctionnalités qui ont été ajoutés n'ont aucun caractère obligatoire. Si vous le souhaitez, vous pouvez continuer à utiliser LameGrid comme vous le faisiez avant.

2. Optimisations

Un gros travail a été fait sur l'optimisation en termes de vitesse et d'occupation mémoire.

D'après mes propres tests cette version réduit par un facteur d'au moins 2 la mémoire consommée (toutefois la mémoire n'est pas simple à mesurer en .Net). En ce qui concerne la vitesse le gain est également supérieur à 2 x sur un remplissage classique à l'aide de la propriété Text. Grâce à l'utilisation des nouveautés de cette version (Types et Styles) les gains en vitesse sont substanciels (jusqu'à 30 fois).


3. Les types

Jusqu'ici LameGrid considérait chaque cellule en type String. Cette méthode a l'avantage d'être simple d'emploi et tout à fait satisfaisante dans la plupart des cas. Néanmoins pouvoir spécifier un type à l'ensemble d'une colonne présente plusieurs avantages :

   - Maîtriser la cohérence des données saisies par l'utilisateur
   - Effectuer un tri conforme (pour les dates en particulier)
   - Rapidité du remplissage pour les types autres que String avec la nouvelle propriété DirectValue (voir plus bas)
   - Réduction de l'occupation mémoire (pour les types numériques notamment)

Pour affecter un type à une colonne, j'ai ajouté la propriété ColValueType.

Grille.Col(0).ValueType = LameGrid.ColValueType.Date
Grille.get_Col(1).ValueType = LameGrid.ColValueType.Numeric;
Une fois la colonne affectée à un type vous avez 2 solutions pour accéder au contenu d'une cellule :

   - La propriété Text comme précédemment : la valeur String sera transformée dans le type adéquat.
   - La propriété DirectValue : dans ce cas on manipule directement la valeur dans le type de la colonne de destination.

Si le gain en vitesse est conséquent pour les dates et les numériques, vous devez prendre garde d'affecter le même type de valeur que celui spécifié pour la colonne.
Grille(i, 0).DirectValue = Date.Now
Grille[i, 1].DirectValue = Convert.ToDouble(i);

4. Les Styles

Un des interêt de LameGrid est la facilité avec laquelle on manipule l'apparence d'une cellule (couleur, police, alignement ...).

Grille[i, c].BackColor = Color.FromArgb(255, 0, 0); Grille[i, c].ForeColor = Color.FromArgb(0, 0, 255 ); Grille[i, c].Font = new Font("Arial", 10, FontStyle.Bold); Grille[i, c].StringFormat = Grille.get_CellFormatType(StringAlignment.Center, StringAlignment.Center);
Cette facilité a un prix : Dans l'exemple ci-dessus pour changer le look de nos cellules, le contrôle va devoir répéter 4 fois les mêmes opérations (récupération de l'objet cellule, rafraîchissement du dessin de la grille ...).

Pour la plupart des applications (quelques millers de cellules) on reste dans des performances très correctes (opération inférieure à la seconde). Mais si on veut changer l'apparence d'un nombre conséquent de cellules (plusieurs dizaines de milliers de cellules), l'opération peut prendre un certain temps.

J'ai ajouté la notion de style pour 2 raisons :

1) Changer l'apparence d'une cellule en une opération

Dim Style As LameGrid.Grid.CellStyle For i As Integer = 1 To Grille.RowsCount - 1 For c As Integer = 0 To 2 Rvb = (i And 1) * 255 Style = New LameGrid.Grid.CellStyle Style.BackColor = Color.FromArgb(Rvb, 0, 0) Style.ForeColor = Color.FromArgb(0, 0, 255 - Rvb) Style.Font = New Font("Arial", 10, FontStyle.Bold) Style.StringFormat = Grille.CellFormatType(StringAlignment.Center, StringAlignment.Center) Grille(i, c).SetStyle(Style) Next Next
   Le look de la cellule est modifié en un coup. Dans l'exemple ci-dessus on va environ 3 fois plus vite qu'avec la première méthode.

2) Partager un style entre plusieurs cellules

Dim Style1 As New LameGrid.Grid.CellStyle Style1.BackColor = Color.FromArgb(0, 0, 0) Style1.ForeColor = Color.FromArgb(0, 0, 255) Style1.Font = New Font("Arial", 10, FontStyle.Bold) Style1.StringFormat = Grille.CellFormatType(StringAlignment.Center, StringAlignment.Center) For i As Integer = 1 To Grille.RowsCount - 1 For c As Integer = 0 To 2 Grille(i, c).SetStyle(Style1) Next Next
Dans ce cas un seul style est utilisé pour un ensemble de cellule :

   - Gain de vitesse conséquent (60000 cellules en 200 millisecondes)
   - Gain en mémoire très conséquent (les x cellules vont pointer sur le même style partagé)
   - La modification du style affecte automatiquement l'ensemble des cellules le partageant (on peut faire changer l'apparence de milliers de cellules en 1 ligne de code)


5. L'évènement CellRowColChange

Cet évènement m'a été demandé par Philippe Lasserre qui a écrit un excellent cours sur VB.NET.

Comme son nom l'indique cet évènement est déclenché sur changement de cellule active. On envoie en paramètre la dernière position connue de la cellule active.

Private Sub Grille_CellRowColChange(ByVal LastRow As Integer, ByVal LastCol As Integer) Handles Grille.CellRowColChange

6. Support des images

J'ai laissé "en avant première" une gestion sommaire des images. Pour l'instant il n'y a pas de notion d'alignements, l'image s'affiche en haut à gauche de la cellule. J'y travaille.

Style1.Image = Image.FromFile("d:/temp/Recette.gif");
Le Gdi+ n'étant pas un foudre de guerre, il est conseillé d'y aller mollo sur la taille des images, sinon des ralentissements se feront ressentir.


Responsable bénévole de la rubrique Microsoft DotNET : Hinault Romaric -