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 :

View ViewModel et tables multiples


Sujet :

C#

  1. #1
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut View ViewModel et tables multiples
    Bonjour;

    Voilà plusieurs jours que j'écris des messages afin de disposer d'aide mais que mes topics visent plusieurs sujets qui se rejoignent et sont un peu flous.
    Je me permets donc de créer un nouveau topic plus global avec des informations moins floues et des détails.

    Je cherche à créer un formulaire pour créer des commandes; celle-ci se compose de lignes de commandes.
    Chaque ligne peut être associée à un numéro d'affaire qui peut être différent pour chaque ligne de la commande(table Affaires).


    Ma base de données ressemble à ceci :
    Nom : BDD.png
Affichages : 126
Taille : 39,4 Ko

    Je cherche à créer ce genre de View :
    Nom : 1.PNG
Affichages : 120
Taille : 31,7 Ko

    Pour ce qui est de mon CommandeFournisseurViewModel il est fait de cette manière :

    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
    namespace ViewModel
    {
        public class CommandeFournisseurViewModel : BaseViewModel<CommandeFournisseur>, INotifyPropertyChanged
        {
     
            public CommandeFournisseurViewModel(CommandeFournisseur CommandeFournisseur) : base(CommandeFournisseur)
            {
                Titre = "CommandeFournisseur";
     
            }
     
            public CommandeFournisseur CommandeFournisseur
            {
                get { return ObjectEntity as CommandeFournisseur; }
            }
     
     
            public EntityCollection<CommandeFournisseurLigne> CommandeFournisseurLignes
            {
                get { return ObjectEntity.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 ObservableCollection<CommandeFournisseurLigne> _test = null;
            public ObservableCollection<CommandeFournisseurLigne> test
            {
                get {
                    if (_test == null)
                    {
                        _test = new ObservableCollection<CommandeFournisseurLigne>(CommandeFournisseur.CommandeFournisseurLignes);
     
     
                    }
     
                    return _test;
                }
                set { _test = value; }
            }
     
     
            private ICommand _DeleteLine = null;
            public ICommand DeleteLine
            {
                get
                {
                    if (_DeleteLine == null)
                        _DeleteLine = new DelegateCommand<CommandeFournisseurLigne>((CommandeFournisseurLigne Parametre) => ExecuteSupprimerLigne(Parametre));
     
                    return _DeleteLine;
                }
            }
            private void ExecuteSupprimerLigne(CommandeFournisseurLigne Parametre)
            {
                CommandeFournisseurLignes.Remove(Parametre);
        }
    }
    Ce qui me permet d'atteindre EntityCollection<CommandeFournisseurLigne> CommandeFournisseurLignes.
    Cela me permet d'obtenir les lignes de la commande ainsi que le numéro d'affaire de chaque ligne via :
    <ig:TextColumn Key="Affaire.Numero"/>







    Pour ce qui est du binding de ma view il est fait de cette manière :
    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
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
     
    <UserControl x:Class="WpfERP.View.CommandeFournisseurView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:View="clr-namespace:WpfERP.View;assembly="
                xmlns:ViewModel="clr-namespace:ViewModel;assembly=ViewModel"
                 mc:Ignorable="d" 
                 d:DesignHeight="800" d:DesignWidth="1000"
                 xmlns:ig="http://schemas.infragistics.com/xaml"
                 xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
                 MinHeight="400" MinWidth="800"
                 MaxHeight="800" MaxWidth="1000">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="420"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
     
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
     
     
            <Grid Grid.Column="0" Grid.Row="0" Margin="5">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition  Width="300"/>
     
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="auto"/>
                </Grid.RowDefinitions>
     
                <TextBlock Grid.Column="0" Grid.Row="0" Text="N° de Cde" />
                <TextBox   Grid.Column="1" Grid.Row="0" Text="{Binding CommandeFournisseur.NumeroCommande}" />
     
                <TextBlock Grid.Column="0" Grid.Row="1" Text="Demandeur" />
                <TextBox   Grid.Column="1" Grid.Row="1" Text="{Binding CommandeFournisseur.Personne.Nom}" />
     
                <TextBlock Grid.Column="0" Grid.Row="2" Text="Livraison" />
                <TextBox   Grid.Column="1" Grid.Row="2" Text="{Binding CommandeFournisseur.Etablissement.Nom}" />
     
                <CheckBox Grid.Column="0" Grid.Row="4" Grid.ColumnSpan="2" IsChecked="{Binding CommandeFournisseur.RegleParDemandeur}" Content="Réglée par le Demandeur"/>
     
                <Grid Grid.Column="1" Grid.Row="4" HorizontalAlignment="Right" Margin="70 0 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="70"/>
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
     
     
                    <TextBlock   Grid.Column="0"  Text="Monnaie"  HorizontalAlignment="Left"/>
     
                    <ComboBox Grid.Column="1" 
                      ItemsSource="{Binding ListeDevise}"
                      SelectedValue="{Binding CommandeFournisseur.Devise.ID}"
                      SelectedValuePath="ID" HorizontalAlignment="Right" Width="150" 
                    >
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Background="Transparent">
                                    <TextBlock.Text>
                                        <MultiBinding StringFormat="{}{0} - {1}">
                                            <Binding Path="Symbole" />
                                            <Binding Path="Libelle"/>
                                        </MultiBinding>
                                    </TextBlock.Text>
                                </TextBlock>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
     
                </Grid>
     
            </Grid>
     
            <ig:XamGrid Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" x:Name="dataGrid"
                        ItemsSource="{Binding CommandeFournisseurLignes}"
                        AutoGenerateColumns="false"
                        DeleteKeyAction="DeleteRowOfActiveCell">
     
     
                <ig:XamGrid.Columns>
                    <ig:TextColumn Key="Affaire.ID"/>
                    <ig:TextColumn Key="Description"/>
                    <ig:TextColumn Key="PrixUnitaire"/>
                    <ig:TextColumn Key="Quantite"/>
                    <ig:TextColumn Key="Total_HT"/>
     
     
     
     
                    <ig:TemplateColumn HeaderText="Supprimer" Key="CommandeFournisseur" HorizontalContentAlignment="Center">
                        <ig:TemplateColumn.ItemTemplate>
                            <DataTemplate>
                                <Button Template="{StaticResource commandsItemTemplate}"/>
                            </DataTemplate>
                        </ig:TemplateColumn.ItemTemplate>
                    </ig:TemplateColumn>
                </ig:XamGrid.Columns>
     
     
     
                <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>
     
     
                <!--Edition de ligne via double click-->
                <ig:XamGrid.EditingSettings>
                    <ig:EditingSettings AllowEditing="Row" IsMouseActionEditingEnabled="DoubleClick" 
                            IsEnterKeyEditingEnabled="True" IsF2EditingEnabled="True" 
                            IsOnCellActiveEditingEnabled="False" />
                </ig:XamGrid.EditingSettings>
     
     
                <!--Ajout de ligne via double click-->
                <ig:XamGrid.AddNewRowSettings>
                    <ig:AddNewRowSettings   AllowAddNewRow="Top"
                                IsEnterKeyEditingEnabled="True"
                                IsF2EditingEnabled="False"
                                IsMouseActionEditingEnabled="DoubleClick"
                                IsOnCellActiveEditingEnabled="True"/>
                </ig:XamGrid.AddNewRowSettings>   
            </ig:XamGrid>
     
            <Grid Grid.Column="1" Grid.Row="0" Margin="5">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="120"/>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="auto" />
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
     
                <TextBlock Grid.Column="0" Grid.ColumnSpan="4" Grid.Row="0" Text="Informations Fournisseur" TextAlignment="Center" Margin="0 5"/>
     
                <Label Grid.Column="0" Grid.Row="1">Nom :</Label>
                <!--<TextBlock Grid.Column="0" Grid.Row="1" Text="Nom" />-->
                <TextBox   Grid.Column="1" Grid.Row="1" Text="123456" />
     
                <ComboBox Grid.Column="1" Grid.Row="1"
                      ItemsSource="{Binding ListeFournisseur}"
                      SelectedValue="{Binding CommandeFournisseur.IDFournisseur}"
                      DisplayMemberPath="Nom"
                      SelectedValuePath="ID" 
                    />
     
                <Label Grid.Row="1" Grid.Column="2">Autre Fournisseur :</Label>
                <!--<TextBlock Grid.Column="2" Grid.Row="1" Text="Autre Fournisseur" />-->
                <TextBox   Grid.Column="3" Grid.Row="1" Text="" />
     
                <Label Grid.Column="0" Grid.Row="2">N° de Devis</Label>
                <!--<TextBlock Grid.Column="0" Grid.Row="2" Text="N° de Devis" />-->
                <TextBox   Grid.Column="1" Grid.Row="2" Text="{Binding CommandeFournisseur.NumeroDevis}" />
     
                <Label Grid.Column="2" Grid.Row="2">Contact : </Label>
                <!--<TextBlock Grid.Column="2" Grid.Row="2" Text="Contact" />-->
                <TextBox   Grid.Column="3" Grid.Row="2" Text="" />
     
                <Label Grid.Column="0" Grid.Row="3">Téléphone : </Label>
                <!--<TextBlock Grid.Column="0" Grid.Row="3" Text="Téléphone" />-->
                <TextBox   Grid.Column="1" Grid.Row="3" Text="" />
     
                <Label Grid.Column="2" Grid.Row="3">Fax :</Label>
                <!--<TextBlock Grid.Column="2" Grid.Row="3" Text="Fax" />-->
                <TextBox   Grid.Column="3" Grid.Row="3" Text="" />
     
                <Label Grid.Column="0" Grid.Row="4">Délai :</Label>
                <!--<TextBlock Grid.Column="0" Grid.Row="4" Text="Délai" />-->
                <TextBox   Grid.Column="1" Grid.Row="4" Text="" />
     
                <Label Grid.Column="2" Grid.Row="4">Règlement :</Label>
                <!--<TextBlock Grid.Column="2" Grid.Row="4" Text="Règlement" />-->
                <TextBox   Grid.Column="3" Grid.Row="4" Text="" />
     
                <Label Grid.Column="0" Grid.Row="5">Commentaire :</Label>
                <!--<TextBlock Grid.Column="0" Grid.Row="5" Text="Commentaire" />-->
                <TextBox   Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="5"  Text="" />
     
            </Grid>
        </Grid>
    </UserControl>

    Mes problèmes sont les suivants :

    1) lorsque je supprime une ligne commande seule la valeur de la clé étrangère de la ligne commande et passé à NULL; ce que je ne tolère pas dans ma BDD car contrainte non NULL.

    De plus il ne s'agit pas que de la suppression de la liaison mais belle est bien de la ligne de commande, celle-ci doit donc être supprimée de la table LigneCommande et non pas modifier la clé étrangère.


    2) Lors de la modification du numéro d'affaire, la modif se répercute dans la table Affaires et change le numéro d'affaire dans la table alors que mon objectif est de modifier la liaison entre la commande ligne et le numéro d'affaire afin d'attribuer la commande ligne à une autre affaire . (Cas inverse du précédent)
    Update de la table Affaire au lieu de la colonne id affaire de CommandeFournisseurLigne.

    Edit :
    J'ai un peu avancer, j'ai remplacé le binding suivant "Affaire.ID" à "IDAffaire" qui appartient à l'objet commandeLigne. Le seul hic c'est que cette ID ne veut rien dire pour un utilisateur lambda...
    j'aimerai afficher quelque chose de plus cohérent du genre le libélle et non pas un chiffre entre 1 et 1000.

    3) Comment maintenir ma vue à jour ?


    4) J'aimerais remplacer le texte de la textbox du tableau (numéro) pas une combo-box permettant de choisir à quel numéro d'affaire attribuer la ligne.
    La textbox pourrait être préchargée par les infos retrouvées dans la table Affaires.



    Je ne sais donc pas comment résoudre ces problèmes qui ne me permettent pas de réaliser le fonctionnement que j'ai prévu.


    Merci pour toute votre aide déjà apportée et celle que vous pourriez m'apporter en plus.

  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 : 38
    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
    Points : 3 958
    Points
    3 958
    Par défaut
    Concernant ton 1er problème c'est une limitation connue d'EF dans sa gestion des lignes "abandonnées".

    La solution est d'explicitement effacer la ligne via le DbContext.

    Pour faire abstraction de cette "bidouille" tu peux utiliser le pattern repository pour encapsuler toutes tes opérations d'accès aux données.
    Dedans tu aurais une opération du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void EffacerLigneCommande(CommandeFournisseur commande, CommandeFournisseurLigne ligne)
    {
        commande.CommandeFournisseurLignes.Remove(ligne);
     
        context.CommandeFournisseurLignes.Remove(ligne);
     
        context.SaveChanges();
    }

  3. #3
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    j'ai donc fais sa via une ICommand avec un bouton dans mon tableau,ce qui donne ceci :


    Pour la View
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
     
                    <ig:TemplateColumn Key="ID" HeaderText="Supprimer" HorizontalContentAlignment="Center">
                        <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>



    Et pour le 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
     
     private ICommand _DeleteLine = null;
            public ICommand DeleteLine
            {
                get
                {
                    if (_DeleteLine == null)
                        _DeleteLine = new DelegateCommand<CommandeFournisseurLigne>((CommandeFournisseurLigne Parametre) => ExecuteSupprimerLigne(Parametre));
     
                    return _DeleteLine;
                }
            }
            private void ExecuteSupprimerLigne(CommandeFournisseurLigne Parametre)
            {
                CommandeFournisseurLignes.Remove(Parametre);
                DataAccess.EntitiesContext.Context.DeleteObject(Parametre);
        }
    Autre problème suite à cette suppression, mon tableau ne se met pas à jour (Infragistics Xamgrid) je suis obligé d'effectuer un tri pour qu'il se rafraichisse. Je ne comprends pas pourquoi.
    Si tu à une idée du pourquoi je veux bien des infos.
    Merci pour ce premier point.

  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 : 38
    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
    Points : 3 958
    Points
    3 958
    Par défaut
    Le pourquoi c'est que le type de ta collection CommandeFournisseurLignes, EntityCollection, n'implémente pas INotifyCollectionChanged.
    Donc la Grid n'a aucun moyen de savoir que le contenu de la collection a changé.

    Tu devrais passer par une ObservableCollection mais ça risque de compliquer un peu plus la tuyauterie.
    Essaye plutôt de "feinter" en levant PropertyChanged quand tu modifies la collection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void ExecuteSupprimerLigne(CommandeFournisseurLigne Parametre)
    {
        CommandeFournisseurLignes.Remove(Parametre);
        DataAccess.EntitiesContext.Context.DeleteObject(Parametre);
        PropertyChanged(this, new PropertyChangedEventArg("CommandeFournisseurLignes"));
    }

  5. #5
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    La classe hérite de BaseViewModel qui implémente INotifyPropertyChanged de cette manière :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            #region INotifyPropertyChanged
     
            public void RaisePropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            #endregion



    J'ai donc fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
            private void ExecuteSupprimerLigne(CommandeFournisseurLigne Parametre)
            {
                CommandeFournisseurLignes.Remove(Parametre);
                DataAccess.EntitiesContext.Context.DeleteObject(Parametre);
                RaisePropertyChanged("CommandeFournisseurLignes");
            }

    Sans impact, la ligne ne disparaît toujours qu'après un tri via la colonne du tableau...



    Sinon j'ai une 2eme solution un peu batarde.
    J'active la solution de suppression du tableau qui est : DeleteKeyAction="DeleteRowOfActiveCell"

    Qui me supprime une ligne via la touche suppr.

    Et pour finir je rajoute ceci dans la view :
    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
     
    public partial class CommandeFournisseurView : UserControl
        {
            public CommandeFournisseurView()
            {
                InitializeComponent();
                this.dataGrid.RowDeleting+=dataGrid_RowDeleting;
            }
     
            void dataGrid_RowDeleting(object sender, Infragistics.Controls.Grids.CancellableRowEventArgs e)
            {
     
                 if (MessageBox.Show("Etes vous sure de vouloir supprimer la ligne ?", "Attention", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                {
     
                    DataAccess.EntitiesContext.Context.DeleteObject(e.Row.Data);
     
                }
                else
                {
                    e.Cancel = true;
                }
     
            }
    Mais j'accède au context via la vue de manière direct; donc pas très propre

  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 : 38
    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
    Points : 3 958
    Points
    3 958
    Par défaut
    Sinon mettre l'ItemsSource à null puis lui réassigner la collection originale.

    Je sais plus pourquoi j'avais déjà utilisé ce workaround...

  7. #7
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    Sinon mettre l'ItemsSource à null puis lui réassigner la collection originale.
    Que veux-tu dire par là ? Je fais sa dans le code behind de la view.

    Que penses-tu du morceau de code que je t'ai montré dans la view ? Est-ce une bonne idée ?


    Edit :
    J'ai modifié EntityCollection à ObservableCollection mais je n'arrive pas à mettre à jour le Xamgrid.

    Il n'y a que le Numero d'affaire qui s'efface (sur les 2 cas d'ailleurs) pour détailler, j'ai fais ceci :

    Dans ma view :
    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
       <!--Tableau de test pour du binding mode observable collection-->
            <ig:XamGrid Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" x:Name="dataGridTest"
                        ItemsSource="{Binding other}"
                        AutoGenerateColumns="false">
                <ig:XamGrid.Columns>
                    <ig:TextColumn Key="CommandeFournisseurLigne.IDAffaire"/>
                    <ig:TextColumn Key="CommandeFournisseurLigne.Description"/>
                    <ig:TextColumn Key="CommandeFournisseurLigne.PrixUnitaire"/>
                    <ig:TextColumn Key="CommandeFournisseurLigne.Quantite"/>
                    <ig:TextColumn Key="CommandeFournisseurLigne.Total_HT"/>
                    <ig:TemplateColumn Key="CommandeFournisseurLigne.ID" HeaderText="Supprimer" HorizontalContentAlignment="Center">
                        <ig:TemplateColumn.ItemTemplate>
                            <DataTemplate>
                                <Button Height="15" Style="{StaticResource RemoveButtonStyle}"
                                        Command="{Binding DeleteLine}"/>
                            </DataTemplate>
                        </ig:TemplateColumn.ItemTemplate>
                    </ig:TemplateColumn>
                </ig:XamGrid.Columns>
     
     
                <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>
     
     
                <!--Edition de ligne via double click-->
                <ig:XamGrid.EditingSettings>
                    <ig:EditingSettings AllowEditing="Row" IsMouseActionEditingEnabled="DoubleClick" 
                            IsEnterKeyEditingEnabled="True" IsF2EditingEnabled="True" 
                            IsOnCellActiveEditingEnabled="False" />
                </ig:XamGrid.EditingSettings>
     
     
                <!--Ajout de ligne via double click-->
                <ig:XamGrid.AddNewRowSettings>
                    <ig:AddNewRowSettings   AllowAddNewRow="Top"
                                IsEnterKeyEditingEnabled="True"
                                IsF2EditingEnabled="False"
                                IsMouseActionEditingEnabled="DoubleClick"
                                IsOnCellActiveEditingEnabled="True"/>
                </ig:XamGrid.AddNewRowSettings>
            </ig:XamGrid>

    Dans mon view model

    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
       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; }
            }

    Et j'ai donc un ViewModel de ma nouvelle classe : CommandeFournisseurLigneViewModel

    qui donne ceci :
    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
     
        public class CommandeFournisseurLigneViewModel : BaseViewModel<CommandeFournisseurLigne>
        {
     
            public CommandeFournisseurLigneViewModel(CommandeFournisseurLigne CommandeFournisseurLigne)
                : base(CommandeFournisseurLigne)
            {
                Titre = "CommandeFournisseurLigne";
               // DelegateCommand<CommandeFournisseurLigneViewModel> Delete = new DelegateCommand<CommandeFournisseurLigneViewModel>(this.DeleteExecute);
            }
     
     
            private static CommandeFournisseurLigne t1 = new CommandeFournisseurLigne();
            public CommandeFournisseurLigneViewModel()
                : base(t1)
            {
                Titre = "CommandeFournisseurLigne";
            }
     
     
     
            public CommandeFournisseurLigne CommandeFournisseurLigne
            {
                get { return ObjectEntity as CommandeFournisseurLigne; }
            }
     
     
            public CommandeFournisseur CommandeFournisseur
            {
                get { return CommandeFournisseurLigne.CommandeFournisseur as CommandeFournisseur; }
            }
     
     
     
            private ICommand _DeleteLine = null;
            public ICommand DeleteLine
            {
                get
                {
                    if (_DeleteLine == null)
                        _DeleteLine = new DelegateCommand(() => ExecuteSupprimerLigne());
     
                    return _DeleteLine;
                }
            }
            private void ExecuteSupprimerLigne()
            {
                if (this.CommandeFournisseurLigne != null)
                {
                    DataAccess.EntitiesContext.Context.DeleteObject(this.CommandeFournisseurLigne);
                }
            }
     
        }
    }

    Et donc j'appel la fonction de suppression du nouveau ViewModel CommandeFournisseurLigneViewModel qui ne met pas à jour ma vue...

    Suite à réflexion; j'appel finalement la suppression du père qui est CommandeFournisseurViewModel est c'est la seul façon que j'ai trouvé pour mettre à jour ma Vue.

    En fesant dans ma fonction de suppression ceci
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       DataAccess.EntitiesContext.Context.DeleteObject(Parametre.CommandeFournisseurLigne);
                this.other.Remove(Parametre);

  8. #8
    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 : 38
    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
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Lionhart Voir le message
    Que veux-tu dire par là ? Je fais sa dans le code behind de la view.
    Je pensais à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    object originalValue = grid.ItemsSource;
    grid.ItemsSource = null;
    grid.ItemsSource = originalValue;

  9. #9
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    Ok, donc au final je pense que je n'ai pas le choix mais ça veut dire code dans la view.

    Mon premier problème est donc presque résolu.


    Merci pour tes réponses.

    Ps : Si tu as des idées pour le reste je suis preneur

  10. #10
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    Je me permets de reposter pour savoir si vous auriez une idée sur mes combobox.

    Je cherche à rajouter des combobox préchargées dans mon grid (les données dont j'ai besoin sont dans mon ViewModel parent)

    J'ai lu des trucs sur des classes proxy mais je ne sais pas si c'est bien cela qu'il me faut...


    Merci

Discussions similaires

  1. [VB6] acces à DB à tables multiples
    Par waspy59 dans le forum VB 6 et antérieur
    Réponses: 23
    Dernier message: 27/03/2006, 10h28
  2. requete sql pour bd access97 a tables multiples
    Par waspy59 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 16/03/2006, 00h11
  3. [MYSQL5] Confirmation : create view vs temporary table ?
    Par frochard dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/01/2006, 22h46
  4. VIEW ou TEMPORARY TABLE ?
    Par Burps dans le forum Requêtes
    Réponses: 3
    Dernier message: 29/07/2005, 15h26
  5. tables multiples au lieu de table unique
    Par rafawel dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 13/07/2005, 11h41

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