OVH Cloud OVH Cloud

Couleur cellule Datagrid

5 réponses
Avatar
Annie L.
Cela fait plusieurs fois que j'essai plusieurs programmes concernant la
couleur de fond d'une celulle d'un datagrid. Mais rien ne fonctionne par
rapport à l'implantation de ces programmes dans mon application. Ces
programmes sont volumineux et cela 'bousiile' tout mon projet. Il faudrait
que je recommence au complet (plus de 250,000 lignes). Je me sers déjà de
classes pour gérer mes datagrid. Alors si on me propose d'autres classes cela
va sûrement compliquer les choses.
Y-a-t-il quelqu'un qui pourrait trouver une solution très simple, une
procédure qui colore une cellule d'un datagrid (avec comme paramètre ligne et
colonne et couleur) ou de créer une propriété pour ce datagrid ????
Je n'ai pas assez de connaissance pour réaliser une telle procédure!!!!
Quelqu'un peut-il m'aider?

Merci de vos réponses!

5 réponses

Avatar
aitoz
J'essaye aussi de trouver comment faire pour colorier une cellule ?
si tu trouve je veux bien savoir.
Voici un exemple de code qui marche bien ! mais je ne peux pas avoir la
propriété Forecolor
DgCs = New DataGridTextBoxColumn
DgCs.Width = 100
DgCs.MappingName = "CA"
DgCs.HeaderText = "CA HT ?"
DgCs.NullText = ""
DgCs.Alignment = HorizontalAlignment.Right
DgTs.GridColumnStyles.Add(DgCs)

Moi j'espérais pouvoir faire :

DgCs.gridcolumnstyles.forecolor = color.cyan
Avatar
Zoury
Bonjour Annie et Laurent ! :O)

Il faut absolument sous-classer l'événement Paint de l'objet
DataGridXXXColumn (où XXX peut varier..).

Ex :
On définie nos classes de type DataGridXXXColumn supportant les couleurs :
'***
Public Class DataGridColoredTextBoxColumn
Inherits DataGridTextBoxColumn

Private m_objBackBrush As Brush
Private m_objForeBrush As Brush
Private m_bAlignToRight As Boolean

Public Property BackBrush() As Brush
Get
Return m_objBackBrush
End Get
Set(ByVal Value As Brush)
m_objBackBrush = Value
End Set
End Property

Public Property ForeBrush() As Brush
Get
Return m_objForeBrush
End Get
Set(ByVal Value As Brush)
m_objForeBrush = Value
End Set
End Property

Public Property AlignToRight() As Boolean
Get
Return m_bAlignToRight
End Get
Set(ByVal Value As Boolean)
m_bAlignToRight = Value
End Set
End Property

Protected Overloads Overrides Sub Paint(ByVal g As
System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal
source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer,
ByVal backBrush As System.Drawing.Brush, ByVal foreBrush As
System.Drawing.Brush, ByVal alignToRight As Boolean)

' on initialise les couleurs par défaut si elles n'ont pas été
intialisé par l'utilisateur
If (m_objBackBrush Is Nothing) Then m_objBackBrush = backBrush
If (m_objForeBrush Is Nothing) Then m_objForeBrush = foreBrush

' on passe nos valeurs à la classe de base.
MyBase.Paint(g, bounds, source, rowNum, m_objBackBrush,
m_objForeBrush, m_bAlignToRight)

End Sub

End Class

Public Class DataGridColoredBoolColumn
Inherits DataGridBoolColumn

Private m_objBackBrush As Brush
Private m_objForeBrush As Brush
Private m_bAlignToRight As Boolean

Public Event DataGridColumnPaint As DataGridColumnPaintEventHandler

Public Property BackBrush() As Brush
Get
Return m_objBackBrush
End Get
Set(ByVal Value As Brush)
m_objBackBrush = Value
End Set
End Property

Public Property ForeBrush() As Brush
Get
Return m_objForeBrush
End Get
Set(ByVal Value As Brush)
m_objForeBrush = Value
End Set
End Property

Public Property AlignToRight() As Boolean
Get
Return m_bAlignToRight
End Get
Set(ByVal Value As Boolean)
m_bAlignToRight = Value
End Set
End Property

Protected Overloads Overrides Sub Paint(ByVal g As
System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal
source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer,
ByVal backBrush As System.Drawing.Brush, ByVal foreBrush As
System.Drawing.Brush, ByVal alignToRight As Boolean)

' on initialise les couleurs par défaut si elles n'ont pas été
intialisé par l'utilisateur
If (m_objBackBrush Is Nothing) Then m_objBackBrush = backBrush
If (m_objForeBrush Is Nothing) Then m_objForeBrush = foreBrush

' on passe nos valeurs à la classe de base.
MyBase.Paint(g, bounds, source, rowNum, m_objBackBrush,
m_objForeBrush, m_bAlignToRight)

End Sub

End Class
'***

On les emploi :
'***
Imports System.Drawing

Public Class Form1
Inherits System.Windows.Forms.Form

Private m_dt As DataTable

#Region " Code généré par le Concepteur Windows Form "

Public Sub New()
MyBase.New()

'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()

'Ajoutez une initialisation quelconque après l'appel
InitializeComponent()

End Sub

'La méthode substituée Dispose du formulaire pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer

'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
Me.DataGrid1 = New System.Windows.Forms.DataGrid
CType(Me.DataGrid1,
System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'DataGrid1
'
Me.DataGrid1.DataMember = ""
Me.DataGrid1.HeaderForeColor =
System.Drawing.SystemColors.ControlText
Me.DataGrid1.Location = New System.Drawing.Point(8, 8)
Me.DataGrid1.Name = "DataGrid1"
Me.DataGrid1.Size = New System.Drawing.Size(552, 400)
Me.DataGrid1.TabIndex = 0
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(568, 414)
Me.Controls.Add(Me.DataGrid1)
Me.Name = "Form1"
CType(Me.DataGrid1,
System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Me.Text = "Exemple de DataGrid coloré"

' on créer notre table de données
m_dt = CreateDataTable()

' on ajoute le style de la table à notre grille
DataGrid1.TableStyles.Add(CreateTableStyle(m_dt, Brushes.Beige,
Brushes.LightCoral))

' on lie les données à notre grille
DataGrid1.DataSource = m_dt

End Sub


Private Function CreateDataTable() As DataTable


Dim dt As DataTable
Dim dc As DataColumn


' le nom de la table et les noms
' de colonnes sont employés pour le
' mapping des styles
dt = New DataTable("EMPLOYES")


' on créé trois colonnes dont une booléenne
dt.Columns.Add("NOM", GetType(String))
dt.Columns.Add("PRENOM", GetType(String))
dt.Columns.Add("ACTIF", GetType(Boolean))


' on ajoute des données tests
dt.Rows.Add(New Object() {"Lefebvre", "Yanick", True})
dt.Rows.Add(New Object() {"Durocher", "Robert", False})
dt.Rows.Add(New Object() {"Gamache", "Pierre", False})
dt.Rows.Add(New Object() {"Cardinal", "Simon", True})


' renvoit la table
Return dt


End Function


Private Function CreateTableStyle(ByVal dt As DataTable, ByVal foreBrush
As Brush, ByVal backBrush As Brush) As DataGridTableStyle

' initialise le style de la table
Dim dts As New DataGridTableStyle
dts.MappingName = dt.TableName

' créer les styles pour nos colonne selon leur types
Dim dgcs As DataGridColumnStyle
For Each dc As DataColumn In dt.Columns

If (dc.DataType Is GetType(String)) Then

Dim dgctc As New DataGridColoredTextBoxColumn
dgctc.ForeBrush = foreBrush
dgctc.BackBrush = backBrush
dgcs = DirectCast(dgctc, DataGridColumnStyle)

ElseIf (dc.DataType Is GetType(String)) Then

Dim dgcbc As New DataGridColoredBoolColumn
dgcbc.ForeBrush = foreBrush
dgcbc.BackBrush = backBrush
dgcs = DirectCast(dgcbc, DataGridColoredBoolColumn)

End If

dgcs.MappingName = dc.ColumnName
dgcs.HeaderText = dc.ColumnName
dts.GridColumnStyles.Add(dgcs)

Next

' renvoit le style de la table
Return dts

End Function

End Class
'***


L'exemple suivant montre comment à partir de la technique décrite ci-haut on
peut parvenir à alterner la couleur de fond des lignes du grid selon une
condition :
http://groups.google.com/group/microsoft.public.fr.dotnet.vb/browse_thread/thread/82a0e59bdc15b691/6da2d07187e9dab2

--
Cordialement
Yanick
MVP pour Visual Basic



"aitoz" a écrit dans le message de news:

J'essaye aussi de trouver comment faire pour colorier une cellule ?
si tu trouve je veux bien savoir.
Voici un exemple de code qui marche bien ! mais je ne peux pas avoir la
propriété Forecolor
DgCs = New DataGridTextBoxColumn
DgCs.Width = 100
DgCs.MappingName = "CA"
DgCs.HeaderText = "CA HT ?"
DgCs.NullText = ""
DgCs.Alignment = HorizontalAlignment.Right
DgTs.GridColumnStyles.Add(DgCs)

Moi j'espérais pouvoir faire :

DgCs.gridcolumnstyles.forecolor = color.cyan




Avatar
Aurélien [MS]
Bonjour Annie,

Tu peux mettre du code dans l'événement Item_DataBound de ton Datagrid s'il
est lié à des données.
Cet évenement est levé 1 fois par ligne de ton datagrid, et tu peux accéders
à chaque cellule du contrôle.

Voilà un exemple qui colorie la première cellule de chaque ligne en rouge :

Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As
System.Web.UI.WebControls.DataGridItemEventArgs) Handles
DataGrid1.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType =
ListItemType.AlternatingItem Then
e.Item.Cells(0).BackColor = Color.Red
End If
End Sub

--
Aurélien Norie
Microsoft France
--------------------
Merci de bien vouloir répondre à ce message dans le newsgroup où il a été
posté. Je le consulte régulièrement.


"Annie L." a écrit dans le message de
news:
Cela fait plusieurs fois que j'essai plusieurs programmes concernant la
couleur de fond d'une celulle d'un datagrid. Mais rien ne fonctionne par
rapport à l'implantation de ces programmes dans mon application. Ces
programmes sont volumineux et cela 'bousiile' tout mon projet. Il faudrait
que je recommence au complet (plus de 250,000 lignes). Je me sers déjà de
classes pour gérer mes datagrid. Alors si on me propose d'autres classes
cela
va sûrement compliquer les choses.
Y-a-t-il quelqu'un qui pourrait trouver une solution très simple, une
procédure qui colore une cellule d'un datagrid (avec comme paramètre ligne
et
colonne et couleur) ou de créer une propriété pour ce datagrid ????
Je n'ai pas assez de connaissance pour réaliser une telle procédure!!!!
Quelqu'un peut-il m'aider?

Merci de vos réponses!


Avatar
Annie L.
Mais cela est un évenement pour un Datagrid 'WEB' d'après ce que je vois. Je
veux une procédure simple pour un Winform!

"Aurélien [MS]" a écrit :

Bonjour Annie,

Tu peux mettre du code dans l'événement Item_DataBound de ton Datagrid s'il
est lié à des données.
Cet évenement est levé 1 fois par ligne de ton datagrid, et tu peux accéders
à chaque cellule du contrôle.

Voilà un exemple qui colorie la première cellule de chaque ligne en rouge :

Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As
System.Web.UI.WebControls.DataGridItemEventArgs) Handles
DataGrid1.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType =
ListItemType.AlternatingItem Then
e.Item.Cells(0).BackColor = Color.Red
End If
End Sub

--
Aurélien Norie
Microsoft France
--------------------
Merci de bien vouloir répondre à ce message dans le newsgroup où il a été
posté. Je le consulte régulièrement.


"Annie L." a écrit dans le message de
news:
> Cela fait plusieurs fois que j'essai plusieurs programmes concernant la
> couleur de fond d'une celulle d'un datagrid. Mais rien ne fonctionne par
> rapport à l'implantation de ces programmes dans mon application. Ces
> programmes sont volumineux et cela 'bousiile' tout mon projet. Il faudrait
> que je recommence au complet (plus de 250,000 lignes). Je me sers déjà de
> classes pour gérer mes datagrid. Alors si on me propose d'autres classes
> cela
> va sûrement compliquer les choses.
> Y-a-t-il quelqu'un qui pourrait trouver une solution très simple, une
> procédure qui colore une cellule d'un datagrid (avec comme paramètre ligne
> et
> colonne et couleur) ou de créer une propriété pour ce datagrid ????
> Je n'ai pas assez de connaissance pour réaliser une telle procédure!!!!
> Quelqu'un peut-il m'aider?
>
> Merci de vos réponses!





Avatar
Aurélien [MS]
Oups désolé :o)

Alors si c'est du Windows Forms, voici un document qui devrait t'aider :
"Comment personnaliser une DataGrid WinForm" :
http://www.microsoft.com/france/msdn/support/colones/default.asp

--
Aurélien Norie
Microsoft France
--------------------
Merci de bien vouloir répondre à ce message dans le newsgroup où il a été
posté. Je le consulte régulièrement.


"Annie L." a écrit dans le message de
news:
Mais cela est un évenement pour un Datagrid 'WEB' d'après ce que je vois.
Je
veux une procédure simple pour un Winform!

"Aurélien [MS]" a écrit :

Bonjour Annie,

Tu peux mettre du code dans l'événement Item_DataBound de ton Datagrid
s'il
est lié à des données.
Cet évenement est levé 1 fois par ligne de ton datagrid, et tu peux
accéders
à chaque cellule du contrôle.

Voilà un exemple qui colorie la première cellule de chaque ligne en rouge
:

Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e
As
System.Web.UI.WebControls.DataGridItemEventArgs) Handles
DataGrid1.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType >> ListItemType.AlternatingItem Then
e.Item.Cells(0).BackColor = Color.Red
End If
End Sub

--
Aurélien Norie
Microsoft France
--------------------
Merci de bien vouloir répondre à ce message dans le newsgroup où il a été
posté. Je le consulte régulièrement.


"Annie L." a écrit dans le message de
news:
> Cela fait plusieurs fois que j'essai plusieurs programmes concernant la
> couleur de fond d'une celulle d'un datagrid. Mais rien ne fonctionne
> par
> rapport à l'implantation de ces programmes dans mon application. Ces
> programmes sont volumineux et cela 'bousiile' tout mon projet. Il
> faudrait
> que je recommence au complet (plus de 250,000 lignes). Je me sers déjà
> de
> classes pour gérer mes datagrid. Alors si on me propose d'autres
> classes
> cela
> va sûrement compliquer les choses.
> Y-a-t-il quelqu'un qui pourrait trouver une solution très simple, une
> procédure qui colore une cellule d'un datagrid (avec comme paramètre
> ligne
> et
> colonne et couleur) ou de créer une propriété pour ce datagrid ????
> Je n'ai pas assez de connaissance pour réaliser une telle procédure!!!!
> Quelqu'un peut-il m'aider?
>
> Merci de vos réponses!