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 :

Modifier uniquement le dernière élément d'un Datagrid, xaml C#


Sujet :

Windows Presentation Foundation

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 30
    Points : 30
    Points
    30
    Par défaut Modifier uniquement le dernière élément d'un Datagrid, xaml C#
    Bonjour à tous,

    Je dispose d'un datagrid et mon objectif est de modifier uniquement le dernière élément pour le mettre en gras:

    Voici l'affichage :
    Nom : datagrid.PNG
Affichages : 283
Taille : 22,3 Ko

    Voici le code xaml :
    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
    <DockPanel>
            <DataGrid AlternatingRowBackground="AliceBlue" FontSize="14" Name="DataGrid" CopyingRowClipboardContent="DataGrid_CopyingRowClipboardContent" SelectionChanged="DataGrid_SelectionChanged">
     
                <DataGrid.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Style.Setters>
                            <!--  <Setter  Property="FontWeight" Value="bold"></Setter> Voici la première façon pour mettre en gras mais ceci mais toutes les lignes en gras et ce n'est pas l'objectif-->
                        </Style.Setters>
                        <Style.Triggers>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter Property="Background" Value="YellowGreen"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </DataGrid.CellStyle>
            </DataGrid>
        </DockPanel>
    Voici le code C# :
    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
     var requete =
                    from t in TraceLog.DataTraces
                    group t by new { t.SI, t.Name } into g
                    orderby g.Sum((t) => t.Duration.Ticks) descending, g.Count() descending, g.Key.SI, g.Key.Name
                    select new
                    {
                        SI = g.Key.SI,
                        Id = g.Key.Name,
                        Nombre = g.Count(),
                        Total = new TimeSpan(g.Sum((t) => t.Duration.Ticks)),
                        Echec = g.Count((t) => t.Echec)
                    };
     
                //Requête concaténé comme derniere élément du DataGrid totalisant les informations suivantes: nb total requete, nb fail, nb temps 
                requete = requete.Concat(new[]
                {
                    new
                    {
                        SI = "Total",
                        Id = "",
                        Nombre = requete.Sum(r => r.Nombre),
                        Total = new TimeSpan(requete.Sum(r => r.Total.Ticks)),
                        Echec = requete.Sum(r => r.Echec),
                    } 
                });
                DataGrid.ItemsSource = requete;
                /* Je ne sais pas si je doit ou même si je peut personnaliser le dernière élément de mon datagrid ici */
                DataGrid.FontWeight = FontWeights.Bold; //ici comme dans le code xaml je peut mettre toutes les lignes en gras
                //je n'arrive pas à faire un truc du genre DataGrid.Rows.Last ou DataGrid.items.Last ou ce genre de truc
    Voilà j’espère avoir été assez clair sur mon objectif, je souhaite mettre uniquement en gras la dernière ligne Total de mon datagrid, merci énormément d'avance pour votre aide.

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Bonjour
    Ton ami est l'ItemContainerStyle du DataGrid qui cible un DataGridRow ....
    Mais comment doit-il opiner pour connaitre la dernière DataGridrow ? c'est là que tu dois lui donner un coup de pouce dans le Data Model généré par ta Requête ,en créant un champ "drapeau" que j'ai appelé GRAS
    de type bool ...
    Evidemment un tel champ "intrus" doit opérer discrètement dans les coulisses ,aussi doit-il être "caché" (hidden)..

    code exemple du class Model Salarie de test :
    code behind .cs:

    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
     
    using System;
    using System.Linq;
    using System.Collections.ObjectModel;
    namespace WpfRequete
    {
        public class Salarie
        {
            public string ID { get; set; }
            public string Nom { get; set; }
            public double Salaire { get; set; }
            public Salarie()
            {
            }
        }
        public class Salaries:ObservableCollection <Salarie>
        {
            private Random rnd = new Random();
            public Salaries()
            {
                for (int i = 1; i < 11; i++)
                {
                    double s =rnd.Next(2,20)*100.0;
                    Salarie salarie = new Salarie() { ID = i.ToString(), Nom = "item"+i.ToString(),  Salaire = s };
                    this.Add(salarie);
                }
     
            }
        }
    }
    code xaml du Form User :
    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
     
     
    <Window x:Class="WpfRequete.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfRequete" 
            Title="Window1" Height="300" Width="300">
        <Window.Resources>
            <local:Salaries x:Key="data"/>
            <!--Style par defaut pour ItemContainerStyle du DataGridRow-->
            <Style  TargetType="DataGridRow" >
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=GRAS}" Value="True">
                        <Setter Property="BorderBrush" Value="DodgerBlue" />
                        <Setter Property="BorderThickness"  Value="2.5" />
                        <Setter Property="Background"  Value="Beige"   />
                        <Setter Property="Foreground" Value="Red"   />
                        <Setter Property="FontSize"  Value="14" />
                        <Setter Property="FontWeight"  Value="Bold" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=GRAS}" Value="False">
                        <Setter Property="Background"  Value="DarkRed"  />
                        <Setter Property="Foreground" Value="LightBlue"  />
                    </DataTrigger>
     
                </Style.Triggers>
            </Style>
        </Window.Resources>
     
        <Grid>
            <DataGrid 
                AutoGenerateColumns="true"  
                AlternatingRowBackground="BlanchedAlmond"
                FontSize="14" Name="DataGrid" 
                ItemsSource="{Binding }"
                Loaded="DataGrid_Loaded">
     
            </DataGrid>
        </Grid>
    </Window>
    code behind .cs du Form User avec ta requête adaptée au Class Salarie :

    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
     
    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 WpfRequete
    {
        /// <summary>
        /// Logique d'interaction pour Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            private Salaries liste = null;
            public Window1()
            {
                InitializeComponent();
            }
     
     
            private void DataGrid_Loaded(object sender, RoutedEventArgs e)
            {
                liste = new Salaries();
                var requete =
                          from salarie in liste
                          group salarie by new { salarie.ID, salarie.Nom } into g
                          orderby g.Sum((t) => t.Salaire) descending, g.Count() descending, g.Key.ID, g.Key.Nom
                          select new
                          {
                              SI = g.Key.ID,
                              Id = g.Key.Nom,
                              Nombre = g.Count(),
                              Total = g.Sum((t) => t.Salaire),
                              GRAS = false
                          };
     
                //Requête concaténé comme derniere élément du DataGrid totalisant les informations suivantes: nb total requete, nb fail, nb temps 
                requete = requete.Concat(new[]
                    {
                        new
                        {
                            SI = "Total",
                            Id = "",
                            Nombre = requete.Sum(r => r.Nombre),
                            Total = requete.Sum(r => r.Total),
                            GRAS=true
                        } 
                    }
                );
                this.DataGrid.ItemsSource = requete;
                // On dissimule le checkbox (si commente ce code tu veras le checkbox autogenere )
                int index = this.DataGrid.Columns.Count - 1;
                for (int i = 0; i < this.DataGrid.Items.Count; i++)
                {
                    DataGridColumn col = this.DataGrid.Columns[index];
                    if (col != null)
                        col.Visibility = Visibility.Hidden;
                }
            }
        }
    }
    bon code...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 30
    Points : 30
    Points
    30
    Par défaut
    Ouah MERCI énormément, c'est ce dont j'avais besoin et ton aide ingénieuse m'a permis de pouvoir réaliser exactement ce que je voulais, merci à toi franchement un gros bravo, les aides rapides et efficaces comme cela sont extrêmement plaisantes.

    A la prochaine, je l'espère .

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

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