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 :

WPF - ADO.NET : Effacement des commandes à la consolidation :7


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut WPF - ADO.NET : Effacement des commandes à la consolidation :7
    VS2015 - WPF - ADO.NET - ACCESS

    Je fais face à un comportement anormal lorsque j'enregistre des commandes d'un client dans une relation Maître/Détail au travers de deux DataGrid.

    Lorsque je saisis un client sur la dernière ligne vide du contrôle DataGrid Maître, ensuite je saisis une commande de ce client dans le DataGrid Détail sur la dernière ligne de ce contrôle, et que je clique sur le bouton d'enregistrement, pendant la phase de consolidation dans la source de données, l'application efface le contenu du contrôle détail alors que la vue de la table des commandes a bien pris en compte la commande que je viens d'enregistrer.
    Si je relance l'application et que je me positionne sur le client que je viens de rentrer, la commande apparaît bien dans le DataGrid des commandes.

    J'ai tracé le parcours en phase de consolidation et m'aperçois que l'anomalie est liée à la fonctionnalité de mise à jour des clés étrangères des enregistrements du DataTable Commandes lorsque la numérotation automatique du client est effectuée dans l'évènement RowUpdated du Datable Clients. La propriété de la relation est Update Cascade.

    Avant lancement de la consolidation
    Nom : Capture Avant.PNG
Affichages : 1516
Taille : 18,1 Ko

    Pendant
    Nom : Capture Pendant.PNG
Affichages : 1493
Taille : 31,2 Ko

    Après consolidation
    Nom : Capture Apres.PNG
Affichages : 1226
Taille : 18,1 Ko

    Je ne sais vraiment pas comment régler ce problème et cela fait quelques jours que je cherche désespérément. Je suis tombé sur des liens sur internet qui en parlent mais sans solution :
    https://stackoverflow.com/questions/...-from-datagrid
    https://connect.microsoft.com/Visual...-binding-issue

    Chose encore plus bizarre, lorsque je saisis un nouveau client et que je l'enregistre d'abord dans un premier temps, puis ensuite je saisis une commande, la colonne de clé étrangère de l'enregistrement Commande est initialisée de manière erronée avec une numérotation auto incrémentée, alors qu'elle devrait reprendre la valeur de la clé primaire de l'enregistrement Client. Mais bon, cela est un autre problème mais qui pourrait être cependant lié au premier.

    Aussi, je me permets de vous indiquer un lien de téléchargement de mon projet WPF pour éventuellement que vous puissiez reproduire le comportement et éventuellement m'aidez à résoudre ce problème qui est très bloquant pour moi et le projet sur lequel je travaille.

    https://drive.google.com/file/d/0B64...ew?usp=sharing

    Merci d'avance de votre aide
    .

  2. #2
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut
    Bonjour,
    Je souhaiterais corriger un point de mon post concernant la numérotation automatique du client qui est plutôt effectuée dans l'évènement RowUpdated du TableAdapter du DataTable Clients. La relation entre deux tables Clients et Commandes inclue la contrainte de clé étrangère et prévoie les règles Update Cascade, Delete Cascade et Accept/Reject None.

    le code de la méthode RowUpdated est :

    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
     
            private void dataadapterClients_RowUpdated(object sender, OdbcRowUpdatedEventArgs args)
            {
                if (args.RecordsAffected > 0)
                {
                    if (args.StatementType == StatementType.Insert)
                    {
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Attibue un numero d'ordre au client nouvellement cree");
     
                        OdbcCommand cmdIdentity = new OdbcCommand("SELECT @@IDENTITY", args.Command.Connection);
                        cmdIdentity.Transaction = Transaction;
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Avant numerotation automatique du client");
                        int id = (int)(cmdIdentity.ExecuteScalar());
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Client_ID : " + id);
                        args.Row.Table.Columns["Client_ID"].ReadOnly = false;
                        args.Row.Table.DataSet.Tables["Commandes"].Columns["Client_ID"].ReadOnly = false;
                        MessageBox.Show("Stop ??????????????????");
                        args.Row["Client_ID"] = id;
                        args.Row.Table.Columns["Client_ID"].ReadOnly = true;
                        args.Row.Table.DataSet.Tables["Commandes"].Columns["Client_ID"].ReadOnly = true;
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Apres numerotation automatique du client");
                    }
                    if (args.StatementType == StatementType.Insert || args.StatementType == StatementType.Update)
                    {
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Recuperation de l'horodatage de la ligne client. Type d'ordre : " + args.StatementType);
     
                        int intCriteria = 0;
                        if (args.StatementType == StatementType.Insert)
                            intCriteria = (int)args.Row["Client_ID"];
                        else
                            intCriteria = (int)args.Row["Client_ID", DataRowVersion.Original];
                        OdbcCommand cmdStamp = new OdbcCommand("SELECT Stamp FROM Clients WHERE Client_ID = " + intCriteria, args.Command.Connection);
                        cmdStamp.Transaction = Transaction;
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Avant ExecuteScalar");
                        DateTime dteStamp = (DateTime)(cmdStamp.ExecuteScalar()); // DateTime.Now
                        Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Horodatage : " + dteStamp);
                        args.Row.Table.Columns["Stamp"].ReadOnly = false;
                        args.Row["Stamp"] = dteStamp;
                        args.Row.Table.Columns["Stamp"].ReadOnly = true; // true
                    }
                }
                else
                {
                    // args.Row.RowError = "Conflit d'acces concurrentiel optimiste rencontre"; // Concurrency Violation Encountered
                    // args.Status = UpdateStatus.SkipCurrentRow;
                }
            }
    J'ai donc une forte présomption que l'anomalie proviendrait de l'instruction située juste après le MessageBox.Show() qui initialise l'ID du client et propage la mise à jour (Update Rule Cascade) aux enregistrements enfants correspondant aux commandes du client (une seule commande dans le cas de l'exemple de mon post) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MessageBox.Show("Stop ??????????????????");
    args.Row["Client_ID"] = id;
    Le mécanisme de liaison "TwoWay Binding" de WPF devrait assurer la mise à jour de l'UI, mais dans le cas présent, je fais face à un effacement du DataGrid des commandes bien de la ligne de la commande ait été ajoutée à la table Commandes du Dataset ????

    Nom : Output.jpg
Affichages : 516
Taille : 78,8 Ko

    Est-ce que quelqu'un pourrait m'expliquer ce que j'aurais oublié de faire pour que cela fonctionne correctement ?

    Merci d'avance
    .

  3. #3
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut
    Je n'ai toujours pas réussi à trouver une solution mon problème de non affichage des enregistrements à l'issue d'une saisie sur la dernière ligne vide du DataGrid Détail.
    Je désespère...
    Merci à toute âme charitable qui pourrait m'aider à le résoudre
    .

  4. #4
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut
    Pourriez-vous me confirmer qu'il est effectivement possible de "binder" des contrôles WPF (DataGrids) à des sources de données ADO.NET (DataViews et Datatables) ?
    Merci
    .

  5. #5
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Pour DataView je pense que oui, ça implémente IList, ICollection... Pour DataTable c'est moins sûr. Mais ça ne me parait de toute façon pas une très bonne idée. Pourquoi tu ne veux pas passer par un pattern MVVM ? Ça te permettrait de repartir les difficultés sur plusieurs couches.

  6. #6
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 941
    Par défaut
    Ce n'est pas trop pour moi la question d'utiliser un pattern plutôt qu'un autre.
    Je cherche à faire tourner mon appli avec certaines technos : VS2015 - WPF - ADO.NET - ACCESS, sans recours à un pattern particulier.
    A vrai dire, je voudrais reproduire d'une certaine manière en WPF quelque chose qui fonctionne parfaitement en WinForms... (;
    Jusque-là, je n'ai rencontré aucun souci, sauf le cas de figure discuté ici.
    https://connect.microsoft.com/Visual...wupdated-event
    .

Discussions similaires

  1. [WPF][ADO.NET] TableAdapterManager.UpdateAll vers Table Access?
    Par Masamunai dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 30/06/2017, 18h52
  2. Différence entre ADO.net LINQ et commandes SQL
    Par ramzichouchan dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/07/2015, 17h49
  3. ado.net, lecture des données spatiales
    Par Muller Guy dans le forum Développement
    Réponses: 2
    Dernier message: 13/09/2011, 17h57
  4. [B.NET][ADO.NET] Créer des composants à la volée
    Par DotNET74 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/12/2007, 16h31
  5. [ADO.Net][VB.NET] Comment copier des données entre deux BDD différentes ?
    Par maddog2032 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 06/06/2005, 12h01

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