1. Pourquoi LameGrid ?

Cet article à é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 vraiments 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égligable.

En Win32, Microsoft fournissait l'activeX Flexgrid qui permettait de satisfaire à la plupart des demandes de manière assez intuitive (un coup d'oeil à la doc suffisait). Il est toujours possible d'utiliser cet activeX dans vos programmes mais on perd du coup l'intêret du .net.

LameGrid a pour ambition de combler ce "vide" et venir en remplacement de la FlexGrid.

2. 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.

Image non disponible

3. 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 plutot qu'a 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( )


Evénements de la grille :

- Celulle cliquée CellClick ( Row, Col, Header )
- Celulle double-cliquée CellDoubleClick ( Row, Col, Header )
- Celulle modifiée par l'utilisateur CellChanged ( Row, Col )
- Changement de celulle active CellRowColChanged ( LastRow, LastCol )

4. 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.

 
Sélectionnez
Grille.Col(0).ValueType = LameGrid.ColValueType.Date
 
Sélectionnez
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.

 
Sélectionnez
Grille(i, 0).DirectValue = Date.Now
 
Sélectionnez
Grille[i, 1].DirectValue = Convert.ToDouble(i);

5. Fonctionnalités avancées : Les Styles

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

 
Sélectionnez
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 2 raisons :

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

 
Sélectionnez
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

 
Sélectionnez

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
   - 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

6. Support des images

J'ai ajouté la possibilité d'afficher une image dans une cellule. Cette opération se fait grace à la propriété image d'un style.

 
Sélectionnez
Style1.Image = Image.FromFile("d:/temp/Recette.gif");

L'alignement de l'image se fait avec la propriété ImageAlignment.

 
Sélectionnez
Style1.ImageAlignment = LameGrid.ImageAlignmentType.Left

7. Etat 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 :

8. 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.

9. Remerciements

Je tiens à remercier Gelati qui m'a fait le gros du debuggage 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.