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

VB.NET Discussion :

DatagridView affichant deux tables liées


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut DatagridView affichant deux tables liées
    Bonjour,

    Et oui, encore une question sur les DataGridView...

    Je dispose d'un DataSet qui contient deux DataTable reliées par une relation de cardinalité 0..1
    Autrement dit, une table parent a, soit zero, soit une occurrence de la table enfant.

    Je pensait qu'il n'y aurait pas trop de problèmes à afficher dans un seul DataGridView les enregistrements de la table parent avec les colonnes de la table enfant qui seraient renseignées si l'occurrence vaut 1, et qui seraient vides si l'occurrence vaut 0.

    Mais voilà...une recherche sur ce forum et ailleurs ne m'a pas permis de solutionner le problème.
    J'ai bien essayé de créer dynamiquement une relation entre mes deux tables et d'associer le DataMember de mon DataGrid avec cette relation (et le datasource au dataset au préalable) mais j'ai à ce moment là un message
    Child list for field <ma relation créée> cannot be created.
    Quelqu'un a t-il déjà été confronté à ce problème ?

    Merci par avance pour vos réponses.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Bouuuhhh...
    Personne n'a une idée à ce sujet ?
    Allez, aujourd'hui c'est la rentrée (même pour les pros de VB, y'a pas de raison...).
    Dans le cas où mon problème ne serait pas clair, voici un exemple concret :

    Un client de banque a forcément un compte courant et 0 ou 1 livret A (admettons qu'il ne puisse avoir qu'un seul compte courant...).
    On a deux datatable, une avec les clients et leur compte courant, une avec les livrets A des clients.
    Soit 4 clients, 2 avec livret A et deux sans.
    Je voudrais voir dans mon DataGridView les 4 lignes suivantes

    Client1Id - CompteCourant1 - LivretA1
    Client2Id - CompteCourant2 - LivretA2
    Client3Id - CompteCourant3 - <rien>
    Client4Id - CompteCourant4 - <rien>

  3. #3
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Pourquoi ne pas faire une seule requête avec une jointure.
    Un left join par exemple je crois que sa devrais résoudre ton problème
    select * from client C left join livret L
    on C.comptecourant = L.comptecourant
    @++
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Merci lilroma pour ta réponse.

    Elle n'est cependant pas applicable car j'ai oublié de préciser que le dataset est alimenté par un parsing d'un fichier XML et pas par requête SQL.

    Je n'utilise pas de base de données dans ce cas précis car le nombre d'occurrence/de lignes reste relativement faible.

    La littérature est assez contradictoire, je lis tout autant qu'on ne peut pas directement afficher deux datatable différentes dans un même datagridview, mais aussi qu'il suffirait de créer dynamiquement une relation et de l'affecter à la propriété DataTable (mais bien evidement, ça n'a pas marché quand j'ai voulu le faire...)

  5. #5
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Une solution serais de ne pas utiliser le DataBinding (Le Dataset comme source de données du DataGridView). Tu pourrais par exemple charger ton fichier fichier Xml dans un XmlDocument, tu parcour le fichier et tu remplie chaque ligne de ton DataGridView a la main.

    @++
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Bravo à toi pour essayer d'apporter des réponses à ce problème épineux.

    Helas, mille fois helas...

    Mon Datagridview a une partie en édition (et pas simplement en visualisation). Évidement, ce ne sont pas les identifiants mais quelques champs annexes (du style l'adresse du client).

    Ca me semblerait lourd de mettre à jour le XML document dans l'autre sens et surtout, je refuse de croire qu'il n'y ait techniquement pas de solutions de type binding sur ce problème (sinon, Bill, faudrait songer à bouger le c.l de tes équipes ! )

  7. #7
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Citation Envoyé par nikoko34 Voir le message
    Bravo à toi pour essayer d'apporter des réponses à ce problème épineux.

    Helas, mille fois helas...

    Mon Datagridview a une partie en édition (et pas simplement en visualisation). Évidement, ce ne sont pas les identifiants mais quelques champs annexes (du style l'adresse du client).
    Sa peut toujours se faire sans le binding

    Citation Envoyé par nikoko34 Voir le message
    Ca me semblerait lourd de mettre à jour le XML document dans l'autre sens et surtout, je refuse de croire qu'il n'y ait techniquement pas de solutions de type binding sur ce problème (sinon, Bill, faudrait songer à bouger le c.l de tes équipes ! )
    Beaucoup plus de ligne de code certes mais la lecture, modification et sauvegarde d'un XmlDocument et moin lourd que la lecture, modification et sauvegarde d'un DataSet.

    @++
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    OK, je vais zieuter du côté du XML document.
    Je mettrai à disposition la solution choisie, ça peut intéresser du monde.

    Merci encore pour t'être intéressé à mon problème existentiel !

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Bonjour,
    Chose promise, chose due, voici une méthode qui 'merge' deux datatable pour en créer une seule qu'il suffit d'ajouter à son dataset avant de définir le DataMember à cette nouvelle table.
    Ce code (épuré du try/except) est directement inspiré de ce post (comme quoi, ça paye toujours de perséverer dans les recherches !) :http://www.developpez.net/forums/d47...e-2-datatable/
    Merci à lilRoma pour son active participation et à Dietrich pour sa méthode que j'ai adapté pour les liens de type 0..1.
    Le paramètre spFields contient le nom des deux clefs primaires concernées par le merge.
    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
    Public Function GetJoinInner(ByRef datpTable1 As DataTable, ByRef datpTable2 As DataTable, ByVal spFields As String) As DataTable
       Dim sField_1 As String = spFields.Split(";"c)(0)
       Dim sField_2 As String = spFields.Split(";"c)(1)
       Dim sjointure As String = String.Empty
       Dim returnDT As DataTable = New DataTable()
     
       'Generate columns on output table
       For Each col As DataColumn In datpTable1.Columns
           If Not returnDT.Columns.Contains(col.ColumnName) Then ReturnDT.Columns.Add(col.ColumnName, col.DataType)
       Next
       For Each col As DataColumn In datpTable2.Columns
           If Not returnDT.Columns.Contains(col.ColumnName) Then returnDT.Columns.Add(col.ColumnName, col.DataType)
       Next
     
       If datpTable1.Columns(sField_1).DataType Is System.Type.GetType("System.String") Then
           sjointure = sField_2 & " = '{0}'"
       Else
           sjointure = sField_2 & " = {0}"
       End If
     
       Dim newRow As DataRow = Nothing
       'pour toutes les lignes de la table 1
       For Each row As DataRow In datpTable1.Rows
           newRow = returnDT.NewRow()
           'Copy data from table 1
           For Each col As DataColumn In datpTable1.Columns
               newRow(col.ColumnName) = row(col.ColumnName)
           Next
           'Join table2 and generate all lines (0..1)
           Dim rows() As DataRow = datpTable2.Select(String.Format(sjointure, row(sField_1)))
           If rows.Length = 0 Then 'no occurence found on table 2
               returnDT.Rows.Add(newRow)
           Else
               For Each row2 As DataRow In rows
                   'je recopie les donné de la table2
                   For Each col As DataColumn In datpTable2.Columns
                       newRow(col.ColumnName) = row2(col.ColumnName)
                   Next
                   returnDT.Rows.Add(newRow)
               Next
           End If
       Next
     
       Return returnDT

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

Discussions similaires

  1. [MySQL] Insertion dans deux tables liées
    Par franxi dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/06/2008, 21h22
  2. DataGridView lié à deux tables
    Par the_red_skin dans le forum Windows Forms
    Réponses: 17
    Dernier message: 18/04/2008, 14h54
  3. MAJ afficher deux table dans un datagrid
    Par amelhajer dans le forum VB.NET
    Réponses: 1
    Dernier message: 09/04/2007, 07h36
  4. Incrementation automatique de deux tables liées
    Par fsautejeau dans le forum Access
    Réponses: 8
    Dernier message: 04/07/2006, 12h18
  5. Formulaire affichant deux tables liées à une troisième
    Par Mimi-des-îles dans le forum Access
    Réponses: 1
    Dernier message: 23/02/2006, 13h47

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