IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] Comment mettre une ligne en couleur dans mon DataGrid ?


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 303
    Points : 143
    Points
    143
    Par défaut [C#] Comment mettre une ligne en couleur dans mon DataGrid ?
    Bonjour,

    Pouvez-vous, m'expliquer comment mettre en couleur une ligne (forecolor) de mon datagrid ?

    Ex: Si une cellule de mon datagrid à la valeur "examen réussi", j'aimerais bien que cette ligne/row de mon datagrid soit en rouge.
    Bien entendu, les autres lignes de mon datagrid restent inchangées!

    J'ai été voir sur le site suivant: http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp mais je n'ai rien trouvé !

    Merci d'avance,

    Yves

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 31
    Points : 37
    Points
    37
    Par défaut
    S'il s'agit que des données en lecture, pourquoi pas utiliser un listview?
    Pour colorer une ligne d'un datagrid suivant une valeur, j'ai vu personne le faire correctement.

  3. #3
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 303
    Points : 143
    Points
    143
    Par défaut
    C'est une bonne question !!!
    Quelle sont les grandes différences avec un datagrid sinon le read-only ?

    Au fait, c'est vraiment incroyable/fou qu'il n'y a pas moyen de mettre une ligne en couleur en fonction de son contenu car c'est vraiment utile !!!!

    Yves

  4. #4
    Membre averti
    Avatar de Rami
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 177
    Points : 330
    Points
    330
    Par défaut
    une bonne base de départ:
    MSDN:Customizing the Windows Forms DataGrid

    > Customization 4: Changing Cell BackColor, ForeColor and Font
    Ex Moderateur .Net

  5. #5
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 303
    Points : 143
    Points
    143
    Par défaut
    Tout d'abord un tout grand merci pour vos réponses.

    Je viens d'étudier le code "Customizing the windows forms datagrid", il faut avouer que c'est assez 'hard'.
    En effet, le type qui a réalisé ce projet est Dr en info (bien entendu) !!!

    De ce fait, si vous avez quelque chose de plus abordable

    Merci d'avance,

    Yves

    PS: Allez, je vais prendre un Alka ...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    je crois que c le seul moyen pour colorier un datagrid en winform.

    je l'ai fait pour un programme en vb. c vrai au debut ca parait hard mais en fais tu n'a quune fonction a changer, les autres tu ne les touche pas.
    si tu bloque redis, j'essayerai de te fournir des element de reponse.

    mais ca marche bien

  7. #7
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 303
    Points : 143
    Points
    143
    Par défaut
    Peux-tu me guider en me donnant le nom de la fonction que je dois modifier !

    Un tout grand MERCI,

    Yves

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    pour résumer:

    tu a un fichier vb.
    DataGridFormatCellEventArgs.vb
    dans lequel est

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    Option Strict Off
    Option Explicit On 
     
    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Drawing
     
    Public Class DataGridFormatCellEventArgs
        Inherits EventArgs
        Private _column As Integer
        Private _row As Integer
        Private _font As Font
        Private _backBrush As Brush
        Private _foreBrush As Brush
        Private _useBaseClassDrawing As Boolean
        'Fields
        'Constructors
        'Methods
        Public Sub New(ByVal row As Integer, ByVal col As Integer, ByVal font1 As Font, ByVal backBrush As Brush, ByVal foreBrush As Brush)
            MyBase.New()
            _row = row
            _column = col
            _font = font1
            _backBrush = backBrush
            _foreBrush = foreBrush
            _useBaseClassDrawing = False
     
        End Sub
        Public Property Column() As Integer
            Get
     
                Return _column
     
            End Get
            Set(ByVal Value As Integer)
     
                _column = Value
     
            End Set
        End Property
        Public Property Row() As Integer
            Get
     
                Return _row
     
            End Get
            Set(ByVal Value As Integer)
     
                _row = Value
     
            End Set
        End Property
        Public Property TextFont() As Font
            Get
     
                Return _font
     
            End Get
            Set(ByVal Value As Font)
     
                _font = Value
     
            End Set
        End Property
        Public Property BackBrush() As Brush
            Get
     
                Return _backBrush
     
            End Get
            Set(ByVal Value As Brush)
     
                _backBrush = Value
     
            End Set
        End Property
        Public Property ForeBrush() As Brush
            Get
     
                Return _foreBrush
     
            End Get
            Set(ByVal Value As Brush)
     
                _foreBrush = Value
     
            End Set
        End Property
        Public Property UseBaseClassDrawing() As Boolean
            Get
     
                Return _useBaseClassDrawing
     
            End Get
            Set(ByVal Value As Boolean)
     
                _useBaseClassDrawing = Value
     
            End Set
        End Property
    End Class
    tu a aussi un fichier classe component nommé:

    DataGridFormattableTextBoxColumn.vb
    dans lequel on a

    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
    Option Strict Off
    Option Explicit On 
     
    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Drawing
    Imports System.Windows.Forms
     
    Public Class DataGridFormattableTextBoxColumn
        Inherits DataGridTextBoxColumn
        Private _col As Integer
        'Fields
        'Constructors
        'Events
        'Methods
        Public Sub New(ByVal col As Integer)
            MyBase.New()
            _col = col
     
        End Sub
        Public Event SetCellFormat As FormatCellEventHandler
        Protected Overloads Overrides Sub Paint(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal source As CurrencyManager, ByVal rowNum As Integer, ByVal backBrush As Brush, ByVal foreBrush As Brush, ByVal alignToRight As Boolean)
     
            Dim e As DataGridFormatCellEventArgs
            e = New DataGridFormatCellEventArgs(rowNum, Me._col, Me.DataGridTableStyle.DataGrid.Font, backBrush, foreBrush)
            RaiseEvent SetCellFormat(Me, e)
            If e.UseBaseClassDrawing Then
                MyBase.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight)
            Else
                g.FillRectangle(e.BackBrush, bounds)
                g.DrawString(Me.GetColumnValueAtRow(source, rowNum).ToString, e.TextFont, e.ForeBrush, bounds.X, bounds.Y)
            End If
            If (e.TextFont Is Me.DataGridTableStyle.DataGrid.Font) = False Then
                e.TextFont.Dispose()
            End If
     
        End Sub
     
        Protected Overloads Overrides Sub Edit(ByVal source As CurrencyManager, ByVal rowNum As Integer, ByVal bounds As Rectangle, ByVal [readOnly] As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)
     
            'comment to make cells unable to become editable
            MyBase.Edit(source, rowNum, bounds, [ReadOnly], instantText, cellIsVisible)
     
        End Sub
    End Class
    et un 3eme fichier
    FormatCellEventHandler.vb
    qui a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Strict Off
    Option Explicit On 
     
    Imports Microsoft.VisualBasic
    Imports System
     
    Public Delegate Sub FormatCellEventHandler(ByVal sender As Object, ByVal e As DataGridFormatCellEventArgs)
    dans ta code de ta winform tu rempli ta datagrid.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        DataGrid3.Visible = False
            affiche_grille()
            format_grille(Me.DataGrid3, New FormatCellEventHandler(AddressOf FormatGridCells))
            DataGrid3.Visible = True
    puis dans ton code tu rajoute ces 3 fonctions.

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     Public Sub affiche_grille()
     
            Dim rstemp As New ADODB.Recordset
            Dim temp As Integer
            Dim numfichegrille As Integer
            Dim strsql As String
     
            'cherche le numero de la derniere fiche
            strsql = "SELECT [N°fiche] FROM fiche ORDER BY [N°fiche]"
            rstemp = connect.Execute(strsql)
            numfichegrille = 0
            Do Until rstemp.EOF
                temp = rstemp.Fields(0).Value
                If temp > numfichegrille Then
                    numfichegrille = temp
                End If
                rstemp.MoveNext()
            Loop
     
            Dim MyConnection As System.Data.OleDb.OleDbConnection
            Dim ds As New System.Data.DataSet
            Dim ad As System.Data.OleDb.OleDbDataAdapter
            'selection des 10 dernieres fiche et affichage dans la grille
            Try
                MyConnection = New System.Data.OleDb.OleDbConnection(accessconnect)
                strsql = "SELECT fiche.[N°fiche],fiche.[N°client],client.nomsociete,materiel.designation,materiel.marque,materiel.type,fiche.[N°serie],fiche.refclient,fiche.date,fiche.technicien,fiche.termine,fiche.nondepanne,fiche.bordereau,fiche.encours,fiche.bonpourdevis FROM materiel INNER JOIN (client INNER JOIN fiche ON fiche.[N°client]=client.[N°client]) ON fiche.[N°materiel]=materiel.[N°materiel] WHERE fiche.[N°fiche] BETWEEN " & numfichegrille - 10 & " AND " & numfichegrille & " ORDER BY fiche.[N°fiche] DESC"
                ad = New System.Data.OleDb.OleDbDataAdapter(strsql, MyConnection)
                ds = New System.Data.DataSet
                ad.Fill(ds)
                DataGrid3.DataSource = ds.Tables(0)
            Catch eLoad As System.Exception
                MsgBox(eLoad.Message)
            Finally
                MyConnection.Close()
            End Try
     
            rstemp.Close()
            rstemp = Nothing
     
        End Sub
     
        Private Sub FormatGridCells(ByVal sender As Object, ByVal e As DataGridFormatCellEventArgs)
     
            Dim ligne As Integer
            Dim num As Integer
            Dim col As Integer
            Dim testtermine As Integer
            Dim testnondepanne As Integer
            Dim testbordereau As Integer
            Dim testtableaudonnees As Integer
            Dim testbonpourdevis As Integer
     
            'coloration de la grille
            ligne = DataGrid3.BindingContext(DataGrid3.DataSource, DataGrid3.DataMember).Count
            For num = 0 To ligne - 1
                'test de l'état de la fiche(encours, terminer, livrer)
                testtermine = DataGrid3.Item(num, 10)
                testnondepanne = DataGrid3.Item(num, 11)
                testbordereau = DataGrid3.Item(num, 12)
                testtableaudonnees = DataGrid3.Item(num, 13)
                testbonpourdevis = DataGrid3.Item(num, 14)
                If e.Row = num Then
                    If testtermine = 0 And testnondepanne = 0 And (testtableaudonnees = 1 Or testbonpourdevis = 1) And testbordereau = 0 Then
                        e.BackBrush = Brushes.Tomato
                    ElseIf (testtermine = 1 Or testnondepanne = 1) And testbordereau = 0 Then
                        e.BackBrush = Brushes.Orange
                    ElseIf (testtermine = 1 Or testnondepanne = 1) And Not (testbordereau = 0) Then
                        e.BackBrush = Brushes.GreenYellow
                    End If
                End If
            Next
     
        End Sub
     
        Private Sub format_grille(ByVal grid As DataGrid, ByVal handler As FormatCellEventHandler)
     
            Dim ts As DataGridTableStyle
            ts = New DataGridTableStyle
            Dim dt As DataTable
            dt = CType(grid.DataSource, DataTable)
            ts.MappingName = dt.TableName
            Dim j As Integer
            j = 0
     
            Do While (j < dt.Columns.Count)
                Dim cs As DataGridFormattableTextBoxColumn
                cs = New DataGridFormattableTextBoxColumn(j)
                cs.MappingName = dt.Columns(j).ColumnName
                Select Case j
                    Case 0
                        cs.HeaderText = "N° Fiche"
                        cs.Width = 60
                    Case 1
                        cs.HeaderText = "N° Client"
                        cs.Width = 60
                    Case 2
                        cs.HeaderText = "Nom de Société"
                        cs.Width = 180
                    Case 3
                        cs.HeaderText = "Désignation"
                        cs.Width = 180
                    Case 4
                        cs.HeaderText = "Marque"
                        cs.Width = 160
                    Case 5
                        cs.HeaderText = "Type"
                        cs.Width = 110
                    Case 6
                        cs.HeaderText = "N° de Série"
                        cs.Width = 110
                    Case 7
                        cs.HeaderText = "Réference Client"
                        cs.Width = 110
                    Case 8
                        cs.HeaderText = "Date"
                        cs.Width = 70
                    Case 9
                        cs.HeaderText = "Technicien"
                        cs.Width = 80
                    Case 10
                        cs.HeaderText = "Termine"
                        cs.Width = 0
                    Case 11
                        cs.HeaderText = "Non Dépanné"
                        cs.Width = 0
                    Case 12
                        cs.HeaderText = "BL"
                        cs.Width = 50
                    Case 13
                        cs.HeaderText = "En Cours"
                        cs.Width = 0
                    Case 14
                        cs.HeaderText = "Bon pour Devis"
                        cs.Width = 0
                End Select
                AddHandler cs.SetCellFormat, handler
                ts.GridColumnStyles.Add(cs)
                j = (j + 1)
     
            Loop
            grid.TableStyles.Clear()
            grid.TableStyles.Add(ts)
     
        End Sub
    affiche_grille sert a remplir ta datagrid,
    le 2emme sert a colorier en fonction de mes condition et le dernier a mettre en forme ta datagrid (taille cellule, couleur vu avant etc..)
    donc tu ne modifie que ces 3 derniere et la 2nd pour les couleur.

    bonne chance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/09/2011, 15h45
  2. Réponses: 32
    Dernier message: 27/11/2007, 23h03
  3. Comment lancer une ligne de commande dans un processus en Java.
    Par doyouknow56 dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 13/05/2006, 11h55
  4. Réponses: 7
    Dernier message: 21/03/2006, 13h01
  5. Comment mettre des lignes de couleur dans une TCheckListBox ?
    Par Isa31 dans le forum Composants VCL
    Réponses: 9
    Dernier message: 31/03/2005, 08h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo