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 :

Grid somme par ligne


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Par défaut Grid somme par ligne
    Bonjour,

    J'ai réalisé un tableau avec les lignes de commande que je suis en train de visualiser.
    Ce qui donne ceci :
    Nom : view.PNG
Affichages : 143
Taille : 50,1 Ko

    Mon problème et que je peux mettre à jour chaque ligne.

    Lorsque je modifie la quantité ou le prix unitaire je ne sais pas comment mettre à jour le total_ht.


    Mon tableau est fait de cette façon :
    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
     
       <ig:XamGrid Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" x:Name="dataGridTest"
                        ItemsSource="{Binding other , UpdateSourceTrigger=PropertyChanged}"
                        AutoGenerateColumns="false">
     
     
                <ig:XamGrid.Columns>
                    <ig:TemplateColumn Key="CommandeFournisseurLigne" HeaderText="Numéro d'affaire">
                        <ig:TemplateColumn.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding CommandeFournisseurLigne.Affaire.Numero, UpdateSourceTrigger=PropertyChanged}" />
                            </DataTemplate>
                        </ig:TemplateColumn.ItemTemplate>
                        <ig:TemplateColumn.EditorTemplate>
                            <DataTemplate>
                                <ComboBox Width="50" ItemsSource="{Binding Source={x:Static ViewModel:CommandeFournisseurViewModel.ListeAffaire}}" 
                                          SelectedValue="{Binding CommandeFournisseurLigne.IDAffaire, UpdateSourceTrigger=PropertyChanged}"
                                          DisplayMemberPath="Numero"
                                          SelectedValuePath="ID"
                                          />
                            </DataTemplate>
                        </ig:TemplateColumn.EditorTemplate>
                    </ig:TemplateColumn>
     
                    <!--<ig:TextColumn Key="CommandeFournisseurLigne.Affaire.Numero" IsReadOnly="True"/>-->
                    <ig:TextColumn Key="CommandeFournisseurLigne.Description" />
                    <ig:TextColumn Key="CommandeFournisseurLigne.PrixUnitaire"/>
                    <ig:TextColumn Key="CommandeFournisseurLigne.Quantite"/>
                    <ig:TextColumn Key="CommandeFournisseurLigne.Total_HT" IsReadOnly="True"/>
     
                    <ig:TemplateColumn Key="CommandeFournisseurLigne.ID" HeaderText="Supprimer" HorizontalContentAlignment="Center" IsReadOnly="True">
                        <ig:TemplateColumn.ItemTemplate>
                            <DataTemplate>
                                <Button Height="15" Style="{StaticResource RemoveButtonStyle}"
                                        CommandParameter="{Binding}"
                                        Command="{Binding DataContext.DeleteLine, 
                                    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ig:XamGrid}}}"/>
                            </DataTemplate>
                        </ig:TemplateColumn.ItemTemplate>
                    </ig:TemplateColumn>
                </ig:XamGrid.Columns>
     
                <ig:XamGrid.AddNewRowSettings>
                    <ig:AddNewRowSettings 
                        AllowAddNewRow="Bottom"
                        IsEnterKeyEditingEnabled="True"
                        IsF2EditingEnabled="False"
                        IsMouseActionEditingEnabled="DoubleClick"
                        IsOnCellActiveEditingEnabled="True"/>
                </ig:XamGrid.AddNewRowSettings>
     
                <!--Edition de ligne via double click-->
                <ig:XamGrid.EditingSettings>
                    <ig:EditingSettings AllowEditing="Row" IsMouseActionEditingEnabled="DoubleClick" 
                            IsEnterKeyEditingEnabled="True" IsF2EditingEnabled="True" 
                            IsOnCellActiveEditingEnabled="False" />
                </ig:XamGrid.EditingSettings>
     
                <ig:XamGrid.SelectionSettings>
                    <ig:SelectionSettings CellClickAction="SelectRow" CellSelection="Single" RowSelection="Single"></ig:SelectionSettings>
                </ig:XamGrid.SelectionSettings>
                <ig:XamGrid.RowSelectorSettings>
                    <ig:RowSelectorSettings Visibility="Hidden"/>
                </ig:XamGrid.RowSelectorSettings>
            </ig:XamGrid>

    Mon ViewModel :
    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
     
     public class CommandeFournisseurViewModel : BaseViewModel<CommandeFournisseur>
        {
     
            public CommandeFournisseurViewModel(CommandeFournisseur CommandeFournisseur)
                : base(CommandeFournisseur)
            {
                Titre = "CommandeFournisseur";
     
            }
     
            public CommandeFournisseur CommandeFournisseur
            {
                get { return ObjectEntity as CommandeFournisseur; }
            }
     
     
            public EntityCollection<CommandeFournisseurLigne> CommandeFournisseurLignes
            {
                get { return CommandeFournisseur.CommandeFournisseurLignes as EntityCollection<CommandeFournisseurLigne>; }
            }
     
     
            private static ObservableCollection<Devise> _ListeDevise = null;
            public ObservableCollection<Devise> ListeDevise
            {
                get
                {
     
                    if (_ListeDevise == null)
                    {
                        _ListeDevise = new ObservableCollection<Devise>(DataAccess.EntitiesContext.Context.Devises);
     
                    }
     
                    return _ListeDevise;
                }
            }
     
     
            private static ObservableCollection<Fournisseur> _ListeFournisseur = null;
            public ObservableCollection<Fournisseur> ListeFournisseur
            {
                get
                {
     
                    if (_ListeFournisseur == null)
                    {
                        _ListeFournisseur = new ObservableCollection<Fournisseur>(DataAccess.EntitiesContext.Context.Fournisseurs.OrderBy(F => F.Nom));
     
                    }
     
                    return _ListeFournisseur;
                }
            }
     
            private static ObservableCollection<Etablissement> _ListeEtablissement = null;
            public ObservableCollection<Etablissement> ListeEtablissement
            {
                get
                {
     
                    if (_ListeEtablissement == null)
                    {
                        _ListeEtablissement = new ObservableCollection<Etablissement>(DataAccess.EntitiesContext.Context.Etablissements.OrderBy(F => F.Nom));
     
                    }
     
                    return _ListeEtablissement;
                }
            }
     
     
            private ObservableCollection<CommandeFournisseurLigneViewModel> _other = null;
            public ObservableCollection<CommandeFournisseurLigneViewModel> other
            {
                get
                {
                    if (_other == null)
                    {
                        _other = new ObservableCollection<CommandeFournisseurLigneViewModel>(
     
                            (from CFL in DataAccess.EntitiesContext.Context.CommandeFournisseurLignes
                             from P in DataAccess.EntitiesContext.Context.Personnes
                             where CFL.CommandeFournisseur.IDPersonneDemandeur == P.ID
                             && CFL.CommandeFournisseur.ID == this.CommandeFournisseur.ID
                             && P.IDAffectationSociete == DataAccess.EntitiesContext.Context.IDAffectationSocieteCourant
                             && (CFL.CommandeFournisseur.DateCommande > DateTimeOutil.PremierJanvier)
                             select CFL).ToList().Select(CFL => new CommandeFournisseurLigneViewModel(CFL)));
     
     
                    }
     
                    return _other;
     
                }
                set { _other = value; }
            }
     
     
     
            private static ObservableCollection<Affaire> _ListeAffaire = null;
            public static ObservableCollection<Affaire> ListeAffaire
            {
                get
                {
                    if (_ListeAffaire == null)
                    {
                        _ListeAffaire = new ObservableCollection<Affaire>(DataAccess.EntitiesContext.Context.Affaires.OrderBy(A => A.Numero));
     
     
                    }
                    return _ListeAffaire;
                }
            }
     
     
            public override bool CanSaveCancelCloseChange()
                {
     	             return true;
                }

    Et le ViewModel de chaque ligne est le suivant :
    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
    public class CommandeFournisseurLigneViewModel : BaseViewModel<CommandeFournisseurLigne>
        {
            public CommandeFournisseurLigneViewModel(CommandeFournisseurLigne CommandeFournisseurLigne)
                : base(CommandeFournisseurLigne)
            {
                Titre = "CommandeFournisseurLigne";
            }
     
     
     
            public CommandeFournisseurLigneViewModel()
                : base(new CommandeFournisseurLigne())
            {
                    Titre = "CommandeFournisseurLigne";
                    MessageBox.Show(this.ObjectEntity.ToString());
            }
     
     
     
            public CommandeFournisseurLigne CommandeFournisseurLigne
            {
                get { return ObjectEntity as CommandeFournisseurLigne; }
                set
                {
                    ObjectEntity = value;
                }
            }
     
     
            public CommandeFournisseur CommandeFournisseur
            {
                get { return CommandeFournisseurLigne.CommandeFournisseur as CommandeFournisseur; }
            }
     
     
     
            #region Command
            private ICommand _AfficherDetailCommand = null;
            public ICommand AfficherDetailCommand
            {
                get
                {
                    if (_AfficherDetailCommand == null)
                        _AfficherDetailCommand = new Framework.Windows.DelegateCommand(() => ExecuteAfficherDetail());
     
                    return _AfficherDetailCommand;
                }
            }
            private void ExecuteAfficherDetail()
            {
     
                if (this.Template == null)
                {
                    this.Template = Global.GetDataTemplateFromRessource("CommandeFournisseurDataTemplate");
                    //(WpfERP.Outils.StyleController.FindResource("CommandeFournisseurDataTemplate") as DataTemplate);
                }
     
                Global.AfficherPopUP(new CommandeFournisseurViewModel(this.CommandeFournisseur), true);
            }

    Et le total est récupéré de cette façon :
    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
     public partial class CommandeFournisseurLigne : EntityObject
        {
     
            private double? _Total_HT = null;
            public double? Total_HT
            {
     
                get
                {
                    if (!_Total_HT.HasValue)
                    {
                        _Total_HT = PrixUnitaire * Quantite;
                    }
                    return _Total_HT.Value;
     
                }
            }

    Je ne sais pas comment utiliser PropertyChanged dans ce cas...

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Quand tu modifies PrixUnitaire ou Quantite en plus de notifier de ce changement ajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PropertyChanged(this, new PropertyChangedEventArgs("Total_HT"));

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Par défaut
    En fait c'est bien là que se situe mon problème... Je ne sais pas où vont mes modifications...

    Car j'utilise un Grid et lorsque je fais double click les champs sont directement modifiables dans le tableau.


    Grâce à sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <!--Edition de ligne via double click-->
                <ig:XamGrid.EditingSettings>
                    <ig:EditingSettings AllowEditing="Row" IsMouseActionEditingEnabled="DoubleClick" 
                            IsEnterKeyEditingEnabled="True" IsF2EditingEnabled="True" 
                            IsOnCellActiveEditingEnabled="False" />
                </ig:XamGrid.EditingSettings>

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    PrixUnitaire et Quantite n'ont pas de setters explicites ?
    Tu peux en définir si ce n'est pas le cas, et c'est de là que tu pourras notifier...

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Par défaut
    Si dans le modèle.

    Étant débutant dans le domaine j'ai peur de faire des âneries et de ne pas respecter MVVM...

    Dans ce cas je fais en sorte que mon modèle implémente InotifyPropertyChange et je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PropertyChanged(this, new PropertyChangedEventArgs("Total_HT"));
    Le truc aussi c'est que mon Total_HT est dans une partial class , donc je ne sais pas si sa peu poser problème ?
    (Car framework utilisé pour générer le code du model, fichier edmx avec diagram)

    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
     public partial class CommandeFournisseurLigne : EntityObject
        {
     
            private double? _Total_HT = null;
            public double? Total_HT
            {
     
                get
                {
                    if (!_Total_HT.HasValue)
                    {
                        _Total_HT = PrixUnitaire * Quantite;
                    }
                    return _Total_HT.Value;
     
                }
            }

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Ah oui en effet tu es en "model first" donc tout dépend des templates T4 utilisés. :/

    Deux solutions "complexes" :
    - utiliser des templates un peu plus complets générant des propriétés notifiant
    - conserver les POCOs actuels et utiliser des proxies dynamiques INPC pour les wrapper.

    Sinon il y a la solution simple mais pas forcément faisable, à voir selon ton contexte : utiliser "code first" et reprendre le contrôle sur la génération des types entités et implémenter INPC.

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

Discussions similaires

  1. somme par ligne dans tableau
    Par enamorada dans le forum Langage
    Réponses: 11
    Dernier message: 05/03/2013, 14h16
  2. Somme par ligne selon critère
    Par ludivine666 dans le forum Macro
    Réponses: 8
    Dernier message: 14/02/2013, 17h45
  3. Somme de 2 colonnes ligne par ligne
    Par jerome71300 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 25/10/2007, 15h02
  4. Requête qui fait une somme par ligne
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 10/08/2006, 08h30
  5. somme par lignes
    Par thauvinl dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/10/2005, 11h25

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