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

C# Discussion :

Changer la couleur du texte d'une cellule dans un DataGrid WPF grace à la valeur d'une autre cellule


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Par défaut Changer la couleur du texte d'une cellule dans un DataGrid WPF grace à la valeur d'une autre cellule
    Bonjour

    Je suis debutant en WPF et je cherche le moyen de changer la couleur du texte d'une cellule d'un datagrid en function de la valeur d'une autre cellule de ce meme Item.

    En fait, j'ai une colonne avec une valeur booléenne, et je cherche à ce que sa valeur influe sur la couleur du texte d'une autre cellule qui se trouve sur la meme ligne.



    //Ma source de données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    planificateurData = new DataView();
    planificateurData.Table = new DataTable("OverdueTasks");
    planificateurData.Table.Columns.Add("ID", typeof(long));
    planificateurData.Table.Columns.Add("Name", typeof(string));
    planificateurData.Table.Columns.Add("Job", typeof(string));
    planificateurData.Table.Columns.Add("Equipment", typeof(string));
    planificateurData.Table.Columns.Add("LastMaintenance", typeof(DateTime));
    planificateurData.Table.Columns.Add("NextMaintenance", typeof(DateTime));
    planificateurData.Table.Columns.Add("Hours", typeof(string));
    planificateurData.Table.Columns.Add("HoursOverdue", typeof(int));
    planificateurData.Table.Columns.Add("UseDate", typeof(bool));
    planificateurData.Table.Columns.Add("UseHours", typeof(bool));
    planificateurData.Table.Columns.Add("HightlightDate", typeof(bool));
    planificateurData.Table.Columns.Add("HightlightHours", typeof(bool))
    //Mon code Xaml de mon dataGrid est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <DataGrid x:Name="taches" Margin="10,41,10,301" HeadersVisibility="Column" SelectionMode="Single" SelectionChanged="TachesList_SelectedChange">
         <DataGrid.Columns>
            <DataGridTextColumn x:Name="NameTache" Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="Nom" Width="300" IsReadOnly="True"/>
            <DataGridTextColumn x:Name="JobTache" Binding="{Binding Job}" ClipboardContentBinding="{x:Null}" Header="Travail" Width="300" IsReadOnly="True"/>
            <DataGridTextColumn x:Name="EquipmentTache" Binding="{Binding Equipment}" ClipboardContentBinding="{x:Null}" Header="Equipement" Width="300" IsReadOnly="True"/>
            <DataGridTextColumn x:Name="LastTache" Binding="{Binding LastMaintenance, StringFormat=\{0:dd/MM/yyyy\}}" ClipboardContentBinding="{x:Null}" Header="Dernier Entretien" Width="200" IsReadOnly="True"/>
            <DataGridTextColumn x:Name="NextTache" Binding="{Binding NextMaintenance, StringFormat=\{0:dd/MM/yyyy\}}" ClipboardContentBinding="{x:Null}" Header="Prochain Entretien" Width="200" IsReadOnly="True"/>
            <DataGridTextColumn x:Name="HoursTache" Binding="{Binding Hours}" ClipboardContentBinding="{x:Null}" Header="Heures tournées/installées" Width="200" IsReadOnly="True"/>
            <DataGridTextColumn x:Name="OverHoursTache" Binding="{Binding HoursOverdue}" ClipboardContentBinding="{x:Null}" Header="Heures dépassées" Width="200" IsReadOnly="True"/>
         </DataGrid.Columns>
    </DataGrid>

    C'est la valeur HightLightDate qui doit influencer sur la couleur du texte de la cellule NextTache



    Merci de votre aide

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Salut,

    Connais-tu l'interface IValueConverter ?
    Il suffirait d'implémenter la méthode Convert pour que celle ci renvoie la couleur désirée. Ensuite tu binde la couleur du champ désiré sur la valeur booléenne et la magie va opérer. Pas besoin d'autre chose (pas de binding entre éléments visuels, juste depuis le modèle)

    Christophe

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Par défaut
    Bonjour,

    Non, je ne connais pas trop les IValueConverter, en recherchant sur le net, j'ai vu aussi qu'ils en parlaient.

    Je vais donc chercher un peu plus sur cette voie pour essayer de résoudre mon problème

    Merci de ton aide.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Par défaut
    J'ai apporté les modifications suivantes dans mon code, et pourtant cela ne fonctionne toujours pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <UserControl.Resources>
            <dc:ConverterColorNextMaintenance x:Key="converterColorNextMaintenance"/>
    </UserControl.Resources>
    ...
    <DataGridTextColumn x:Name="NextTache" Binding="{Binding NextMaintenance, StringFormat=\{0:dd/MM/yyyy\}}" ClipboardContentBinding="{x:Null}" Header="Prochain Entretien" Width="200" IsReadOnly="True" Foreground="{Binding HightlightDate, Converter={StaticResource ResourceKey=converterColorNextMaintenance}}" />
    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
     
     [ValueConversion(typeof(bool), typeof(SolidColorBrush))]
        public class ConverterColorNextMaintenance : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if ((bool)value == true)
                    return new SolidColorBrush(Colors.Orange);
                else
                    return new SolidColorBrush(Colors.Black);
            }
     
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return null;
            }
        }
    Si je mets mon convertisseur dans le paramètre Binding de mon DataGridTextColumn , celui-ci me retourne bien le code hexa de la couleur, mais dans le paramètre Foregroud cela ne change pas la couleur de ma colonne.

    Quelqu'un voit-il où j'ai pu commaitre une erreur.

    Merci

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Par défaut
    Après plusieurs recherches sur le Net et grace à l'indice de ChrisDot, j'ai quand même trouvé une solution.
    En fait, il semblerait que les [B]DataGridTextColumn[B] ne permettent pas de changer la couleur du Foreground grâce à un Converter.
    Il faut donc remplacer notre [B]DataGridTextColumn[B] par un DataGridTemplateColumn et y inclure un TextBlock
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <DataGrid.Columns>
            <DataGridTemplateColumn Width="100" Header="test">
                  <DataGridTemplateColumn.CellTemplate>
                         <DataTemplate>
                                <TextBlock Text="{Binding Name}"  Foreground="{Binding Converter={StaticResource converter}}"/>
                         </DataTemplate>
                  </DataGridTemplateColumn.CellTemplate>
           </DataGridTemplateColumn>
    </DataGrid.Columns>
    Merci de votre aide. Je passe donc le sujet en résolu

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    On s'embarque dans des solutions vraiment bizarre et compliquees pour un petit probleme mille fois resolu dans la MSDN Help Library que les debutants ne lisent pas ...
    C'est une affaire de DataTrigger dans le Style de la prop DataGridTextColumn.CellStyle

    code .cs du DataView revu et simplifie à des fins d'illustration
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
     
    namespace WpfAppDataTrigger
    {
       public  class PlanificateurData : DataView
    	{
           public PlanificateurData()
           {
     
               this.Table = new DataTable("OverdueTasks");
               this.Table.Columns.Add("ID", typeof(long));
               this.Table.Columns.Add("Name", typeof(string));
               this.Table.Columns.Add("LastMaintenance", typeof(DateTime));
               this.Table.Columns.Add("NextMaintenance", typeof(DateTime));
               this.Table.Columns.Add("HightlightDate", typeof(bool));
     
     
     
               DataRow row = this.Table.NewRow();
               DateTime t = new DateTime( 2015,1, 1);
               Random rnd = new Random();
               for (int i = 1; i < 11; i++)
               {
                   row["ID"] = "0" + i.ToString();
                   row["Name"] = "Item" + i.ToString();
                   row["LastMaintenance"] = t.AddDays(rnd.Next(1,100));
                   row["NextMaintenance"] = t.AddDays(rnd.Next(150, 366));
                   row["HightlightDate"] =  rnd.Next(1, 20) > 10 ? true:false ;
                   this.Table.Rows.Add(row);
                   row = this.Table.NewRow();
               }
     
           }
    	}
    }
    code xaml du form :
    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
     
    <Window x:Class="WpfAppDataTrigger.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfAppDataTrigger"
            Title="Window1"  Height="350" Width="525">
        <Window.Resources>
            <local:PlanificateurData x:Key="src"/>
        </Window.Resources>
        <Grid >
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"></RowDefinition>
            </Grid.RowDefinitions>
            <DataGrid x:Name="taches" 
                      Margin="10,41,10,204"
                      HeadersVisibility="Column"
                      SelectionMode="Single" SelectionChanged="TachesList_SelectedChange"
                      ItemsSource="{Binding Source={StaticResource src},Path=Table}"
                      AutoGenerateColumns="False"  
                      >
                <DataGrid.Columns>
     
                    <DataGridTextColumn x:Name="NameTache" Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="Nom" Width="100" IsReadOnly="True"/> 
                    <DataGridTextColumn x:Name="LastTache" Binding="{Binding LastMaintenance, StringFormat=\{0:dd/MM/yyyy\}}" ClipboardContentBinding="{x:Null}" Header="Dernier Entretien" Width="100" IsReadOnly="True"/>
                    <DataGridTextColumn x:Name="NextTache" Binding="{Binding NextMaintenance, StringFormat=\{0:dd/MM/yyyy\}}" ClipboardContentBinding="{x:Null}" Header="Prochain Entretien" Width="100" IsReadOnly="True">
                        <DataGridTextColumn.CellStyle>
                            <Style TargetType="DataGridCell" >
                                <Style.Triggers>
                                    <DataTrigger
                                         Binding="{Binding Path=HightlightDate}" Value="True">
                                        <Setter  Property="Background" Value="Red" />
                                        <Setter  Property="FontWeight" Value="Bold" />
                                        <Setter  Property="FontSize" Value="14" />
                                    </DataTrigger> 
                                </Style.Triggers>
                            </Style>
                        </DataGridTextColumn.CellStyle>
                    </DataGridTextColumn>
                    <!-- on affiche HightLightDate pour verifier le comportement voulu-->
                    <DataGridTextColumn  x:Name="HightLightDate" Binding="{Binding HightlightDate }" ClipboardContentBinding="{x:Null}" Header="HightLightDate" Width="100" IsReadOnly="True">
                    <DataGridTextColumn.CellStyle>
                        <Style TargetType="DataGridCell" >
                            <Style.Triggers>
                                    <DataTrigger Binding="{Binding Path=HightlightDate}" Value="True">
                                        <Setter  Property="Background" Value="MediumTurquoise" />
                                        <Setter  Property="Foreground" Value="DarkRed" />
                                    </DataTrigger> 
                            </Style.Triggers>
                        </Style>
                    </DataGridTextColumn.CellStyle>
                    </DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    code .cs du form(rien de special):
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
     
    namespace WpfAppDataTrigger
    {
        /// <summary>
        /// Logique d'interaction pour Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }
     
            private void TachesList_SelectedChange(object sender, SelectionChangedEventArgs e)
            {
     
            }
        }
    }

    Dans ton code xaml du form il manqué l'assignation de l'ItemsSource du DataGrid...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      <DataGrid x:Name="taches" 
                      Margin="10,41,10,204"
                      HeadersVisibility="Column"
                      SelectionMode="Single" SelectionChanged="TachesList_SelectedChange"
                      ItemsSource="{Binding }"
                      AutoGenerateColumns="False"  
                      >
    et dans ton code behind .cs du form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    this.DataContext = planificateurData.Table;
    bon code...

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Par défaut
    Je confirme, la solution des DataTrigger proposées est bien plus simple que l'utilisation des converters.
    Et, en prime, ça marche nickel. Merci de votre aide.

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

Discussions similaires

  1. Récupérer les valeurs d'une colonne dans un datagrid
    Par blackhox dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 03/02/2014, 15h14
  2. [XL-2007] changer la couleur du texte d'une cellule selon sa valeur (en vba)
    Par blackstrange dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 10/07/2012, 08h01
  3. Réponses: 0
    Dernier message: 17/03/2011, 21h42
  4. ajouter une ligne dans un tableau et afficher la valeur d'une variable
    Par dede94 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/05/2010, 17h24
  5. Réponses: 4
    Dernier message: 26/06/2007, 17h19

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