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 Forms Discussion :

[Vb.Net]Datagrid, afficher colonne id liée d'une autre table


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Par défaut [Vb.Net]Datagrid, afficher colonne id liée d'une autre table
    Bonjour,

    Environnement: VS .NET 2003 Fr
    Framework: 1.1
    OS: WinXP Home SP2

    J'ai deux tables dont voici la structure :

    TableA(id_a, libelle_a)
    TableB(id_b, #id_a, libelle_b)

    J'affiche la TableB dans une DataGrid. Les trois colonnes sont mappées sur les trois champs de la table.

    Comment faire pour qu'à la place du champ #id_a je puisse afficher la valeur du libelle_a lié de la TableA ?

    J'ai bien essayé d'utiliser une DataRelation, mais ça m'affiche un [+] en début de ligne pour développer une sous ligne ; ce qui n'est pas le resultat que je recherche.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Par défaut
    J'ai du mal à croire que personne n'ai jamais eu à faire ce genre de chose ?! Ou alors je me suis mal exprimé : Aidez-moi svp...

  3. #3
    Membre Expert Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Par défaut
    Je suppose que tu as un DataSet
    Comment est ce que tu le remplis?
    essaye de ne créer qu'une seule table dans le DataSet et de le charger avec une requête

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Par défaut
    Effectivement j'ai un dataset qui contient ma TableB. Je le remplis à l'initialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dsTableB1.Clear()
    daTableB.Fill(dsTableB1, "TableB")

  5. #5
    Membre Expert Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    dim SQL as string
    SQL = "SELECT IdB, LibA, LibB  FROM A, B WHERE A.IdA = B.IdA"
    ' il faut créer la connexion
     
    Dim odda As New OracleDataAdapter(New OracleCommand(SQL))
    odda.SelectCommand.Connection = oCnx
    Dim oMesDonnees As DS = New DS ' Ton dataset
    odda.Fill(oMesDonnees.TABLE) ' TABLE = nom de la table du dataset
    et donc là tu as un odda avec ton libA

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    même discution qu'ici : http://www.developpez.net/forums/vie...hlight=niamorh

    mais l'idée de modifier la requête de l'odda est bonne aussi

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Par défaut
    Merci de ces réponses.

    LaChips : je n'ai pas bien compris ta proposition (je débute en Vb.Net).

    NiamorH : bon sang mais c'est bien sûr !! Suis trop bête de ne pas y avoir pensé ! C'est la base ! Suis resté trop cantonné à mes tutos de .Net...

    Quoi qu'il en soit, j'ai donc choisi ta méthode NiamorH. Cependant, cela ne fonctionne pas encore à 100%.

    Pour l'ajout d'enregistrements, je passe par des champs textBox, comboBox, et quand j'appuie sur un bouton 'Enregistrer', je dois voir le nouvel enregistrement s'ajouter dans la DataGrid. Sauf que, le libellé que je suis allé chercher par jointure dans la requête ne s'affiche pas dans la colonne sur les nouveaux enregistrements. Pour ce faire, je dois appliquer les changements (daAdapter.Update(...)) pour que ma grille soit rechargée.

    Or je souhaiterais que le libellé du champ lié s'affiche tout de suite !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Par défaut
    Autre problème : je n'ai aucune ligne d'enregistrement. J'ajoute la première :

    libelle_b prend "1234"

    Une ligne apparaît dans la grille :

    --------------
    | Libellé B
    --------------
    > 1234

    J'ajoute une deuxième ligne : libelle_b = "4321". Voici ce qui apparaît désormais dans la grille :

    --------------
    | Libellé B
    --------------
    > 4321 <= Pourquoi je n'ai plus "1234" ??!!
    | 4321

    Je continue et j'ajoute une 3ème ligne : libelle_b = "2413". Le résultat devient :

    --------------
    | Libellé B
    --------------
    > 2413
    | 4321
    | 2413

    J'ajoute enfin une 4ème ligne : libelle_b = "3214" :

    --------------
    | Libellé B
    --------------
    > 3214
    | 4321
    | 2413
    | 3214

    ">" représente le curseur de la ligne courante de la grille. Il semberait donc qu'à chaque fois, la ligne courante prenne la valeur que je viens d'ajouter.

    Pourquoi ?

    ps : tout s'affiche correctement une fois que j'ai fait l'update.

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    alors reprenons.
    tu as donc mis une expression Parent(liaison).NomChamps ?
    lorsque tu clique sur enregistrer, quel code s'execute ?

    normalement ça doit ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dim r as TypeDataSet.laTableRow = monDs.laTable.NewRow
     
    r.champs1 = txtchamps1.text
    ...
    r.champs2 = txtchamps2.text
     
    monDs.laTable.AddRow(r)
    et là ton datagrid se met à jour tout seul.

    dis nous en plus pour qu'on puisse t'aider

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    rassure moi, tu ne te sert de ton datagrid que pour visualiser les données, pas pour les saisir ?
    un petit screenshot de la page en question pourrait m'aider à comprendre de quoi tu parle.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Par défaut
    Non je n'ai rien écrit qui ressemble à "Parent(liaison).NomChamps".

    Voici le contexte de travail (j'utilise toujours les données du premier post) :
    • Un daAdapter (daTableB) : il contient la requête SELECT avec désormais la jointure sur la TableA pour afficher mon libellé. Les autres requêtes (INSERT, DELETE et UPDATE) sont celles par défaut pour la TableB pour permettre l'ajout des enregistrements.
    • Un autre daAdapter (daTableA) : il me sert à remplir ma combo pour l'ajout de nouveaux enregistrements.
    • Un dsTableB qui est le dataset qui me permet d'alimenter ma grille depuis daTableB.
    • Un dsTableA qui est le dataset qui me permet d'alimenter ma combo depuis daTableA
    • Une DataGrid (dgTableB) en lecture seule dont la source est dsTableB. Elle contient deux colonnes qui sont mappés sur mes champs : une colonne sur libelle_b et une autre sur libelle_a (qui est devenu accessible grâce à la jointure).


    Quand j'ajoute un nouvel enregistrement, la fonction suivante est executée :
    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
    '
    ' Ajoute une nouvelle ligne
    '
    ' @param    [Void]
    ' @return   [Boolean]       True si l'ajout a été fait, False en cas d'erreur
    '
    Private Function ajouter() As Boolean
     
        Try
            Dim drNouvelleLigne As DataRow = dsTableB.Tables(K_TABLE_B).NewRow()
     
            drNouvelleLigne(K_CHAMP_LIBELLE_A) = txtLibelleA.Text
            drNouvelleLigne(K_CHAMP_ID_FK_B) = cbTableA.SelectedValue
     
            dsTableB.Tables(K_TABLE_B).Rows.Add(drNouvelleLigne)
     
            Return True
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Impossible d'ajouter l'enregistrement!", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End Try
     
    End Function
    Ca ressemble à ça :


  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Par défaut
    YES ! J'ai résolu un bogue ! Le problème de l'ajout de nouvelles lignes avec la 1ère ligne qui prennait la valeur de celle que je venais d'ajouter n'est plus.

    Il s'agissait de mon champ "Numéro de lot" de la "Fiche lot" (cf screenshot) qui était resté mappé sur mon champ libelle_b de la TableB. Dans le détail, comme ce champ était resté mappé, il mettait toujours à jour l'enregistrement courant (représenté par la flèche ">" en début de ligne) en même temps que j'en ajoutais un nouveau . Et l'enregistrement courant était la 1ère ligne...

    Il me reste donc un problème à régler : afficher le "Code produit" choisi dans la combo "Produit" de la fiche dans la grille sans être obligé de faire un Update sur le DataAdapter...

    A cela s'ajoute un autre problème : la sélection du produit de la combo "Produit" quand j'édite une ligne fait des truc bizarres....mais j'y reviendrai plus tard ; laissons-le de côté pour l'instant.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Par défaut
    Citation Envoyé par SamRay1024
    Il me reste donc un problème à régler : afficher le "Code produit" choisi dans la combo "Produit" de la fiche dans la grille sans être obligé de faire un Update sur le DataAdapter...
    S'il vous plaît ! J'ai besoin d'aide ! Je ne peux pas croire que je sois le seul "couillon" à tomber sur ce problème ?!

Discussions similaires

  1. [AC-2003] Update d'une colonne a partir d'une autre table access
    Par Jarod51 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 07/07/2011, 11h17
  2. Afficher dans une liste la donnée liée d'une autre table
    Par Zhebulon dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/01/2011, 14h36
  3. Réponses: 2
    Dernier message: 29/10/2010, 13h09
  4. Transfer de colonne avec données a une autre table
    Par clarkent dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/11/2009, 15h37
  5. Menu déroulant liée a une autre table
    Par Au2laDeNosReves dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 14/06/2007, 14h24

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