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

Dotnet Discussion :

[Databinding] Comment faire un databinding propre avec une source de donnée complexe?


Sujet :

Dotnet

  1. #1
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut [Databinding] Comment faire un databinding propre avec une source de donnée complexe?
    Un exemple relativement simple pour illustrer le "problème".

    Imaginons que j'ai une vue (winform ou wpf) présentant des personnes stockées dans une base de donnée quelconque (sql server, oracle, postgre...).

    Cette vue est une vue maître/détail, avec une simple liste de "noms prénoms" pour le maître et le reste des informations (adresse, n° de sécu, conjoint, etc..) pour le détail.

    Alors, il va de soit qu'en france, aux yeux de la loi, une personne peut avoir un seul conjoint (s'il en a un) et que le conjoint du conjoint d'une personne A est A.
    Autrement dit, si le conjoint de Donald est Daisy, le conjoint de Daisy est forcément Donald.

    Pour réaliser cette relation un peu particulière, j'utilise un trigger afterupdate, afterinsert. Autrement dit, l'opération de mettre à jour le conjoint de Daisy quand on modifie le conjoint de Donald se fait en dehors du client.

    A partir de là, comment mettre en place un databinding propre et rapide ?

    Recharger la liste complète des personnes chargées dans la vue semble un peu "bourrin" comme méthode, pas très rapide dans la mesure où les personnes peuvent être nombreuses.

    Et mettre à jour "à la main" les personnes concernées par un changement de conjoint, soit au niveau de la DAL, soit au niveau de la BLL semble pas très propre, dans la mesure où cela double le système de mise à jour des données.

    Alors, reste le rechargement des personnes concernées par un changement de conjoint (dont 3 personnes au maximum), mais comment faire avec le databinding de microsoft ?

  2. #2
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Les infos que tu donnes sont complètement insuffisantes pour pouvoir t'aider, mais si je comprend bien, la solution a ton problème serait de charger la liste des détails à la demande au moment de les afficher, c'est mille fois plus propre que de charger en mémoire des tonnes d'informations a l'ouverture de ta form avec 90% qui servent à rien.

  3. #3
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    C'est un peu déjà ce que je fais.

    Seulement, certaines données sont calculées par la base de donnée et donc ne sont pas disponibles chez le client, à moins de :
    - recalculer ces données au niveau du client, ce qui a pour effet de multiplier le nombre de processus et donc d'augmenter le temps de maintenance.
    - recharger les objets modifiés depuis la base de donnée.

    Pour l'exemple que je donnais plus haut :

    Imagines que tu aies une table "personne" comportant les champs : id, nom, prenoms, conjointID
    conjointID est une clef étrangère qui désigne une autre ligne dans la table personne.

    A partir de là, imaginons 3 personnes : A, B et C.
    Si tu as au départ A.conjointID = B.id et C.conjointID = null et que tu effectue l'opération C.conjointID <= A.id, alors la base de donnée se charge de faire les opérations suivantes :
    A.conjointID <= C.id
    B.conjointID <= null

    Le résultat est que, puisque ces deux opérations ont été réalisées sur la base de donnée (le server), A et B ne sont plus à jour sur le client.

    Alors, on recalcule A et B quand on modifie C ? Mais j'aime pas trop parce que ça oblige à écrire deux fois les procédures de mise à jour des champs calculés.

    On recharge A et B ? Pourquoi pas oui, mais comment recharger explicitement A et B sans recharger toute la vue ?

    Enfin bref, je me rends compte que je réfléchis à "haute voix" là, en fait.

  4. #4
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    a quoi ressemble ton UI?

  5. #5
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Imagines une listbox bindée à la liste de toutes les personnes.

    Et une vue détail comprenant divers champs, notemment une combobox pour le conjoint.

  6. #6
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Alors si tu ne charges que la listbox a l'ouverture de la form et qu'ensuite, tu charges les champs de détail au moment du clic sur un élément de la listbox, c'est parfait non?

    Comme je l'ai suggéré dans ma première intervention?

  7. #7
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Autre exemple :

    J'ai une datagridview bindée à une liste d'objets de type T - peu importe les champs de la classe T - numérotés alphabétiquement (A, B, C, D...).

    La numérotation doit être complète, c'est à dire : pas de D sans C, par exemple.
    Si j'ai 5 lignes : A, B, C, D, E, et que je supprime le C, alors D et E doivent être renommés, respectivement, C et D.

  8. #8
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    utilises-tu des DataSet ?
    Je te demande ceci car lors de l'appel à la méthode Update du DataAdapter, le DataSet est mis à jour.
    Si tu n'utilises pas les DataSet, tu utilises peut-être des objets perso et tu utilises peut-être alors un outil de mapping o/r. Peut-être que cet outil te permet d'effectuer quelque chose de similaire à ce qui est effectué avec le DataAdapter.

    A+
    Bye

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/07/2010, 12h11
  2. Réponses: 0
    Dernier message: 26/12/2008, 12h28
  3. Réponses: 7
    Dernier message: 28/06/2008, 19h44
  4. Réponses: 3
    Dernier message: 11/03/2008, 15h10

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