I. Pourquoi LameGrid ?▲
Cet article a été publié initialement en début 2005, c'est-à-dire avant l'arrivée du Framework 2.0. De ce fait, avec la sortie du DataGridView et du ListView, les commentaires suivants ne sont plus vraiment d'actualités.
Le framework fournit déjà un composant de grille puissant qui, s'il est orienté base de données, peut parfaitement être utilisé pour présenter et manipuler des données internes. Toutefois l'affichage rapide de quelques données avec un mimimun de présentation ( couleurs, police ) n'est pas simple et demande un investissement en temps non négligeable.
En Win32, Microsoft fournissait l'activeX Flexgrid qui permettait de satisfaire à la plupart des demandes de manière assez intuitive (un coup d'œil à la doc suffisait). Il est toujours possible d'utiliser cet activeX dans vos programmes, mais on perd du coup l'intérêt du .net.
LameGrid a pour ambition de combler ce « vide » et venir en remplacement de la FlexGrid.
II. L'utilisation de LameGrid▲
Le cahier des charges principal de LameGrid est la simplicité d'utilisation, un maximum de choses paramétrables au niveau de l'IDE, des propriétés et méthodes simples. Le but étant que le contrôle soit aussi simple d'utilisation qu'une ListBox ou autre composant de base.
III. Fonctionnalités de base▲
Propriétés réglables depuis l'IDE et modifiables dynamiquement depuis le code :
- Couleur par défaut des cellules |
CellColor |
- Couleur par défaut du texte |
ForeColor |
- Couleurs par défaut des cellules d'entête |
FixedBackColor, FixedForeColor |
- Couleur de fond de la grille |
BackColor |
- Police par défaut des cellules |
Font |
- Nombre de lignes et de colonnes (entraine un effacement de la grille) |
RowsCount, ColsCount |
- Rangées d'entêtes lignes et colonnes |
FixedRowsCount, FixedColsCount |
- Position de la cellule active |
CurrenRow, CurrentCol |
- Grille en lecture seule ou éditable |
Editable |
- Curseur de sélection par cellule, ligne, colonne ou sans curseur actif |
SelectionMode |
- Ascenseurs horizontaux et verticaux désactivables individuellement |
ShowScrollBar |
- Redimensionnement à la souris des colonnes et lignes |
ResizableCells |
- Paramétrage du dessin du quadrillage des cellules |
GridLines |
- Couleur du quadrillage des cellules |
GridLinesColor |
- Mode d'affichage de la cellule courante (automatique ou manuel) |
SelectedColorMode |
- Couleur de fond de la cellule courante (mode manuel uniquement) |
SelectedBackColor |
- Couleur du texte de la cellule courante (mode manuel uniquement) |
SelectedForeColor |
- Rafraîchissement de l'affichage désactivable ( gain de vitesse sur les grosses opérations ) |
AutoRedraw |
Propriétés uniquement modifiables dynamiquement depuis le code :
- Accès paramètres d'une colonne : |
VB : Col( ColIndex ) C# : get_Col( ColIndex ) Delphi : Col[ ColIndex ] |
|
Propriété Colonne |
- Réglage de la largeur d'une colonne |
Width |
Propriété Colonne |
- Type de données pour la colonne (texte,numérique ou date) |
ValueType |
Propriété Colonne |
- Formatage des valeurs de la colonne (type numérique ou date) |
ValueFormat |
- Accès paramètres d'une ligne : |
VB : Row( RowIndex ) C# : get_Row( RowIndex ) Delphi : Row[ RowIndex ] |
|
Propriété Ligne |
- Réglage de la hauteur d'une ligne |
Height |
- Accès paramètres d'une cellule : |
Cell( RowIndex, ColIndex ) ou C#/Delphi : NomContrôle[ RowIndex, ColIndex ] |
|
Propriété Cellule |
- Texte |
Text |
Propriété Cellule |
- Couleur du texte |
ForeColor |
Propriété Cellule |
- Couleur de fond |
BackColor |
Propriété Cellule |
- Couleur d'entête |
FixedColor |
Propriété Cellule |
- Police d'écriture |
Font |
Propriété Cellule |
- Alignement du texte |
StringFormat |
Propriété Cellule |
- Accès à la valeur de la cellule Pluto qu'à sa représentation texte |
DirectValue |
Méthode Cellule |
- Affectation d'un style à la cellule |
SetStyle |
Méthodes de la grille :
- Ajout dynamique d'une ligne |
AddRow ou AddRow ( RowIndex ) |
- Suppression dynamique d'une ligne |
RemoveRow ou RemoveRow ( RowIndex ) |
- Effacement contenu d'une ligne |
ClearRow ( RowIndex, ClearTextOnly ) |
- Tri d'une colonne ASCII ou numérique par ordre croissant ou décroissant |
Sort ( ColIndex, Desc, Numeric ) |
- Rafraîchissement de la grille (utile si AutoRedraw = false) |
Redraw( ) |
Événements de la grille :
- Cellule cliquée |
CellClick ( Row, Col, Header ) |
- Cellule double-cliquée |
CellDoubleClick ( Row, Col, Header ) |
- Cellule modifiée par l'utilisateur |
CellChanged ( Row, Col ) |
- Changement de cellule active |
CellRowColChanged ( LastRow, LastCol ) |
IV. Fonctionnalités avancées : Les types▲
Par défaut, LameGrid considère 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é ValueType à la propriété Col.
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 deux 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);
V. Fonctionnalités avancées : Les Styles▲
Un des intérêts 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);
Toutefois, traiter plusieurs cellules de manière identique, oblige à répéter pour chaque cellule le code de formatage.
J'ai ajouté la notion de style pour deux 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.
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 cellules :
- gain de vitesse important ;
- gain en mémoire très important (les x cellules vont pointer sur le même style partagé) ;
- la modification du style affecte automatiquement l'ensemble des cellules le partageant.
VI. Support des images▲
J'ai ajouté la possibilité d'afficher une image dans une cellule. Cette opération se fait grâce à la propriété image d'un style.
Style1.
Image =
Image.
FromFile
(
"d:/temp/Recette.gif"
);
L'alignement de l'image se fait avec la propriété ImageAlignment.
Style1.ImageAlignment
=
LameGrid.ImageAlignmentType.Left
VII. État actuel de développement▲
Le contrôle est achevé par rapport à mes objectifs et besoins initiaux. Je ne pense pas le faire évoluer en dehors de la correction de bug.
Je suis ouvert à toutes propositions et critiques constructives :
VIII. Licence▲
LameGrid est distribué en Freeware. Vous pouvez donc l'utiliser à votre guise pour vos programmes, j'essaierai d'être réactif pour la correction des bugs éventuels.
Le contrôle LameGrid est fourni en l'état. L'utilisateur utilise LameGrid à ses risques et périls, sans garantie d'aucune sorte de la part de l'auteur. L'auteur n'est responsable d'aucun dommage subi par l'utilisateur pouvant résulter de l'utilisation ou de la distribution du contrôle LameGrid. De la même façon, l'auteur n'est en aucun cas responsable d'une quelconque perte de revenus ou de profit, ou de données, ou de tous dommages directs ou indirects, susceptibles de survenir du fait de l'utilisation du contrôle ou pour la raison que celui-ci serait inopérant, quand bien même l'auteur aurait été averti de la possibilité de tels dommages.LameGrid est gratuit pour une utilisation privée, commerciale ou éducative (incluant les organisations à but non lucratif). L'utilisation du contrôle LameGrid vaut acceptation par l'utilisateur des termes de la licence ci-dessus.
Si vous trouvez ce contrôle utile et si le mécénat vous tente, vous pouvez m'envoyer un chèque cadeau de chez Amazon.fr ou LDLC du montant qu'il vous plaira.
IX. Remerciements▲
Je tiens à remercier Gelati qui m'a fait le gros du débogage du contrôle sous Delphi 2005. Je remercie également Morpheus et l'équipe de Developpez.com qui m'ont gentiment proposé de m'héberger, ainsi que Ditch pour les corrections.