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 Presentation Foundation Discussion :

Mise en forme cellule DataGrid dynamiquement par le code. [Débutant]


Sujet :

Windows Presentation Foundation

  1. #1
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut Mise en forme cellule DataGrid dynamiquement par le code.
    Bonjour,

    Je cherche à changer la couleur d'une cellule d'un DataGrid qui est créé dynamiquement par code.
    Si je le crée dynamiquement c'est parce que le nombre de colonne est variable.

    Le dataGrid doit permettre de visualiser les données venant de deux tables différentes. Ce sont les données d'un agenda de formation et le client veut pouvoir voir les info sur les participants sur les deux premières colonnes et les colonnes suivantes sont les dates de formation qui contiendront l'information présent / absent.



    J'ai donc le code suivant pour créer la table et lier l'info :
    Code vb.net : 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
        Public Sub ChargeInfo()
            DataGridPresence.SelectionUnit = DataGridSelectionUnit.Cell
            DataGridPresence.Columns.Clear()
            DataGridPresence.AutoGenerateColumns = False
            DataGridPresence.ColumnWidth = DataGridLength.Auto
     
            tableAffiche = New DataTable
     
            tableAffiche.Columns.Add("Usager", GetType(System.String))
            tableAffiche.Columns.Add("Dossier", GetType(System.String))
            tableAffiche.Columns.Add("NI", GetType(System.Int32))
     
            Dim col = New DataGridTextColumn()
            col.Header = NOM_COL_USAGER
            col.Binding = New Binding(NOM_COL_USAGER)
            DataGridPresence.Columns.Add(col)
     
            col = New DataGridTextColumn()
            col.Header = NOM_COL_DOSSIER
            col.Binding = New Binding(NOM_COL_DOSSIER)
            DataGridPresence.Columns.Add(col)
     
            For Each rowSeance In _elementBAEFOR.donnéeBAESEF.table.Rows
                Dim elemBAESEF As ClassElementBAESEF = _elementBAEFOR.donnéeBAESEF.getElement(rowSeance)
     
                Dim nomCol As String = elemBAESEF.pD_ID_séance_formation '.date400ToDate.ToShortDateString
                tableAffiche.Columns.Add(nomCol, GetType(System.String))
     
                Dim col1 = New DataGridTextColumn
                col1.Binding = New Binding(nomCol)
     
                If Not elemBAESEF.pD_Code_delete = "" Then
                    col1.Header = "[SUPPRIMEE]" & vbCrLf
                End If
     
                col1.Header &= "Séance du " & vbCrLf &
                    elemBAESEF.pD_Date_séance_formation.date400ToDate.ToString("dddd") & vbCrLf &
                    elemBAESEF.pD_Date_séance_formation.date400ToDate.ToShortDateString & vbCrLf &
                    "n°" & elemBAESEF.pD_ID_séance_formation
     
     
                DataGridPresence.Columns.Add(col1)
     
                For Each rowPat In elemBAESEF.donneeBAEPAF.getParticipant(elemBAESEF.pD_ID_séance_formation)
                    Dim elemBAEPAF As ClassElementBAEPAF = elemBAESEF.donneeBAEPAF.getElement(rowPat)
                    ' Recherche existe dans table :
                    Dim strDossier As String = elemBAEPAF.NumDosFam.Trim & "/" & elemBAEPAF.pD_Dossier_suffixe
                    Dim tabRow As DataRow() = tableAffiche.Select(NOM_COL_DOSSIER & " = '" & strDossier & "'")
                    Dim RowTableAfficheUsager As DataRow
                    If tabRow.Length = 0 Then
                        RowTableAfficheUsager = tableAffiche.NewRow
                        RowTableAfficheUsager(NOM_COL_DOSSIER) = strDossier
                        RowTableAfficheUsager(NOM_COL_USAGER) = elemBAEPAF.pD_Nom_Prénom_visualisation
                        RowTableAfficheUsager("NI") = elemBAEPAF.pD_NI_participant
                        tableAffiche.Rows.Add(RowTableAfficheUsager)
                    Else
                        RowTableAfficheUsager = tabRow(0)
                    End If
     
                    RowTableAfficheUsager(nomCol) = getTextSuivi(elemBAEPAF)
     
                Next
            Next
     
            If tableAffiche.Rows.Count = 0 Then
                tableAffiche.Rows.Add(tableAffiche.NewRow)
            End If
     
            DataGridPresence.ItemsSource = tableAffiche.DefaultView
            DataGridPresence.FrozenColumnCount = 2
        End Sub

    avec dans le code XAML une simple ligne de déclaration :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            <DataGrid Grid.Row="0"   
                      Name="DataGridPresence"  
                      MaxHeight="300" 
                      ColumnWidth="SizeToHeader" 
                      IsReadOnly="True" 
                      AlternatingRowBackground="#546DD2F2" />

    Ce que je voudrais arriver à faire est de mettre suivant le contenu des cellules des colonnes date un couleur suivant leurs valeurs ex :
    • Présent => Vert
    • Absent => Rouge
    • Excusé => Orange


    J'ai bien sur trouvé des tas d'exemples sur internet en passant par un style à appliquer sur la colonne ou l'utilisation d'un convertisseur et d'autres mais tous utilise le code XAML pour définir et lier les colonnes, ce qui dans mon cas n'est pas possible vu que leur nombre variable.

    Donc si quelqu'un connait une astuce je lui en serai reconnaissant
    Merci de m'avoir lu.

    P.S. : J'avoue avoir du mal à la conversion Windows Forms => WPF même si je me soigne à coup de tutoriel

  2. #2
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    Salut,

    As-tu tenté le coup en insérant un trigger dans ton code-behind
    Genre par exemple :

    Code c# : 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
    CellStyle = new Style
    {
    TargetType = typeof (DataGridCell),
    Triggers =
    	{
    new DataTrigger
    	{
    		Binding = new Binding(taCondition),
    		Value = true//par exemple
    		Setters =
    			{
    				new Setter
    					{
    						Property = Control.BackgroundProperty,
    						Value = Brushes.Red,
    					}
    			}
    	}
    	}
    }

    ps : par contre c'est en c#, je connais pas trop le Vb

  3. #3
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Merci pour ton aide et ta réaction rapide, ça a bien fonctionné
    Voici le code en VB.NET que j'ai utilisé :
    Code vb.net : 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
                Dim col1 = New DataGridTextColumn
                col1.Binding = New Binding(nomCol)
     
                Dim TriggersCell = New DataTrigger()
                TriggersCell.Binding = New Binding(nomCol)
                TriggersCell.Value = "Présent"
                Dim settersTriggers = New Setter()
                settersTriggers.Property = Control.BackgroundProperty
                settersTriggers.Value = Brushes.Green
                TriggersCell.Setters.Add(settersTriggers)
     
                Dim CellStyle = New Style()
                CellStyle.TargetType = GetType(DataGridCell)
                CellStyle.Triggers.Add(TriggersCell)
     
                col1.CellStyle = CellStyle

    Bon code et encore merci

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 11/12/2013, 11h20
  2. Réponses: 6
    Dernier message: 25/06/2009, 22h22
  3. Mise en forme tableau croisé dynamique
    Par opus06 dans le forum IHM
    Réponses: 0
    Dernier message: 13/05/2008, 11h40
  4. Mise en forme cellule et condition
    Par Shadow5 dans le forum Excel
    Réponses: 1
    Dernier message: 21/03/2008, 10h56
  5. [XSLT]Mise en forme d'un tableau par categorie
    Par dibox dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/12/2006, 16h42

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