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 :

Relation Parent/enfant et bidingNavigator


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut Relation Parent/enfant et bidingNavigator
    Bonjour,
    J`ai un souci en Vb.net (je suis sous VS 2010 et je programme une Winform).
    J' ai fait un formulaire avec des contrôles (pour la table Parent), et 2 tables enfants qui dont les données sont chacunes réprésentées dans un dataGridview.

    tout cela manuellement sans utiliser l'IDE. Jusque là la liaison des données et les relations semblent avoir bien fonctionnées.
    Sur mon formulaire j' ai également un BindingNavigator(BN). Le hic est que lorsque j' utilise le BN pour naviguer il n' y a que les données de la table parente qui défilent et pas celles des tables enfants.

    J' ai pour chacune des tables un BindingSource(BS) (donc 3 en tout) et un BN pour la forme. La propriétée BS du BN a été placée sur le BS de la table Parente cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.BindingNavigator1.BindingSource = bsParent
    ensuite dans l'évènement click du bouton MoveNextItem du BN je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bsParent.MoveNext
              bsEnf1.MoveNext
    bsEnf1.MoveNext
    mais rien n' y fait. Les données des autres tables restent sur le premier enregistrement.

    Merci pour toute aide.

  2. #2
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    776
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 776
    Points : 275
    Points
    275
    Par défaut
    Je débute aussi (enfin ... depuis août environ) et je développe une appli qui fonctionne un peu comme toi (sauf que la table parent est un DTG et que les enfants sont un DTG pour l'un et des champs pour l'autre.

    A chaque fois que je me déplace dans le parent, je provoque une Sub appelée MAJ_enfants

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private DTG_RowEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DTGparent.RowEnter
    MAJ_enfants(DTGparent:=DTGparent, index:=e.RowIndex)
    End Sub
    Le coeur de cette sub dit à peu près cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CurrentKey = DTGparent.Rows(index).Cells("N_ref").Value
     
                        bs_enfant.Filter = "N_ref = " & CurrentKey
    Le principe est que tu filtres le bindingsource (bs) de ton enfant en faisant correspondre les champs de liaison (il y a forcément un ou plusieurs champs communs)

    Concernant les BN, normalement tu n'as pas à coder la navigation. elle se fait toute seule (je me suis aussi fait avoir au début...)

    J'espère que ces indications te seront utiles.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    Merci Noftal,
    C' est vrai que chaque infos m' est utile. Et même si je suis un p' tit peu embrouillée je te dis quand même merci d' avoir pris du temps pour me répondre.
    En fait mon dépaysement vient de deux choses:
    1. Du fait que le concept chez toi est un p' tit peu différent
    2. mais aussi du fait que je cherchais à quel moment tu avais fait test datarelations et si oui comment?

    Concernant les BN, normalement tu n'as pas à coder la navigation. elle se fait toute seule (je me suis aussi fait avoir au début...)
    Enfin ... oui mais en partie car les enfants correspondants ne défilent pas lorsque je passe à un autre enregistrement.

    Au chargement de mon formulaire j' ai pourtant l' enreistrement dans les DTG enfants correspondants.

    L' unique piste que je soupconne encore en ce moment ce serait peut-être des relations pas bien faîtes.

    Pour cela j' ai:
    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
     Dim ds as New Dataset  'Mon DS
    'Pour le Parent
            Dim bsParent as New BindingSource
            Dim dtParent as DataTable
            Dim daParent as New DataAdapter("Select * from Parent order by ID", conn) 'ici conn est ma connection à ma base de données
     
    daParent.Fill(ds, "Parent")
    dtParent = New DataTable("Parent")
    daParent.Fill(dtParent) 'Cette Ligne me semble être certes redondante mais lorsque je l' efface, 
                         'j' ai au moment de l' execution une erreur de bindage: ArgumentException
    'Enfant1 dans le 1er DTG
     Dim daEnf1 as New DataAdapter("Select e.enf1ID, e.cola,e.colb,e.colc from enf1 e, parent p where e.enf1ID = p.ID Order by e.enf1ID", conn)
    daEnf1.Fill(ds, "Enf1")
    ds.Dispose()
    dtEnf1 as New DataTable("Enf1")
     
    'Enfant2 dans le 2eme DTG
     Dim daEnf2 as New DataAdapter("Select b.enf2ID, b.col1,b.col2,b.col3 from enf2 b, parent p where b.enf2ID = p.ID Order by b.enf2ID", conn)
    daEnf2.Fill(ds, "Enf2")
    ds.Dispose()
    dtEnf2 as New DataTable("Enf2")
    'Relations   
    Dim Rel1 as New DataRelation("parentenf1", ds.Tables("Parent").Columns("ID"), ds.Tables("Enf1").Columns("enf1ID"))
    Dim Rel2 as New DataRelation("parentenf2", ds.Tables("Parent").Columns("ID"), ds.Tables("Enf2").Columns("enf2ID"))
    'L'ajout des relations au DataSet
    ds.Relations.Add(Rel1)
    ds.Relations.Add(Rel2)
    'Liaison aux sources de données
    bsParent.DataSource = dtParent
     
    Me.dgtEnf1.DataSource = ds
    Me.dgtEnf1.DataMember = "Parent.parentenf1"
     
    Me.dgtEnf1.DataSource = ds
    Me.dgtEnf1.DataMember = "Parent.parentenf2"
    Merci de votre aide.

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    BONJOUR

    c'est possible mais difficile à manager car il faut faire intervenir le Dataset & DataTable Parent
    Exemple :
    Soit 3 tables reliees en cascade:
    -Relat1 :tableparent ->tablechild1
    -Relat2 :tableparent ->tablechild1

    Creer 3 bindingsources & les connecter en cascade (suivant "le sens" des relations):
    -binder 1er bindingsource (bsParent) au Dataset
    -assigner à DataMember tableparent

    -binder le 2eme bindingsource au 1er
    -assigner à DataMember Relat1
    -binder le 3eme bindingsource au 2eme
    -assigner à DataMember Relat2

    Assigner aux 3 dgv chacun son bindingsource...

    Assigner aux textbox les bindingsources souhaites...

    Ne pas oublier d'assigner le bsParent au Navigator
    code .vb:
    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
     
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim bsParent As New BindingSource
            Dim bsChild1 As New BindingSource
            Dim bsChild2 As New BindingSource
            Dim BindingNavigator1 As New BindingNavigator(True)
     
     
            Dim parentCol As DataColumn
            Dim childCol As DataColumn
     
            '1/ Lier le Navigator au 1er BindingSource 
            myNavigator.BindingSource = bsParent
     
     
            '2/ Fill du DataSet qui est fait en general par une function
            '   specifique de chargement des donnees 
            Dim tonDtaset As New DataSet
            Dim da As New OleDbDataAdapter
            da.Fill(tonDtaset, "TableParent")
            da.Fill(tonDtaset, "TableChild1")
            da.Fill(tonDtaset, "TableChild2")
     
     
            'les relations dans cet exemple sont en cascade
            'TableParent => lie à TableChild1
            'TableChild1 => lie à TableChild2
     
            'Relation1
            parentCol = tonDtaset.Tables("TableParent").Columns("champCle1")
            childCol = tonDtaset.Tables("TableChild1").Columns("champCle1")
            Dim relat1 As New DataRelation("Relat1", parentCol, childCol)
     
            'Relation2
            parentCol = ClientCommandesProductSet.Tables("TableChild1").Columns("champCle2")
            childCol = ClientCommandesProductSet.Tables("TableChild2").Columns("champCle2")
            Dim relat2 As New DataRelation("Relat2", parentCol, childCol)
     
            'ASTUCE ....lier bsParent à dataset et table parent !!!!
            bsParent.DataSource = tonDtaset
            bindingSource1.DataMember = "TableParent"
     
            ' => bsChild1 se connecte sur bsParent
            bsChild1.DataSource = bindingSource1
            bsChild1.DataMember = "Relat1"
     
            ' => bsChild2 se connecte sur bsChild1 
            bsChild2.DataSource = bindingSource2
            bsChild2.DataMember = "Relat2"
     
            '4/ =>Les dgv se connecte chacun sur son bindingsource
     
            DataGridView1.DataSource = bindingSource1
            DataGridView2.DataSource = bindingSource2
            DataGridView3.DataSource = bindingSource3
     
            '5/ =>Suivent les  textbox chacun sur son bindingsource
            'pour table parent
            TextBox1.DataBindings.Add("Text", bindingSource1, "champCle1", True, DataSourceUpdateMode.OnPropertyChanged)
            TextBox2.DataBindings.Add("Text", bindingSource1, "champ2", True, DataSourceUpdateMode.OnPropertyChanged)
     
            '  =>pour table child1
            TextBox3.DataBindings.Add("Text", bindingSource2, "champCle2", True, DataSourceUpdateMode.OnPropertyChanged)
            TextBox4.DataBindings.Add("Text", bindingSource2, "champ2", True, DataSourceUpdateMode.OnPropertyChanged)
            TextBox5.DataBindings.Add("Text", bindingSource2, "champ3", True, DataSourceUpdateMode.OnPropertyChanged)
     
     
        End Sub

    Nota-Bene:j'ai ecris suivant "le sens" des relations car elles peuvent differer et ne pas etre "cascade"...

    Par exemple:
    - Relat1 :tableparent ->tablechild1
    - Relat2 :tableparent ->tablechild2

    Dans ce cas la connection du 3eme bindingsource devient:

    -binder le 3eme bindingsource au 1er
    -assigner à DataMember Relat2


    bon code...

  5. #5
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    Un grand Merci à toi MABROUKI,
    J' essaie ca de suite et je te tiens au courant mais au passage J' ai d' abord avant de comment quelques questions:

    Assigner aux 3 dgv chacun son bindingsource...
    J' ai plutôt 2 dgv (pour les 2 tables enf.)

    Les données de la première table (Parent) sont affichées dans differents txtBox.
    et Pour ces txtBox j' ai un bindage de ce genre certes pas avec toutes tes précisions de pro!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     TextBox1.DataBindings.Add("Text", bindingSource1, "champCle1", True, DataSourceUpdateMode.OnPropertyChanged)
            TextBox2.DataBindings.Add("Text", bindingSource1, "champ2", True, DataSourceUpdateMode.OnPropertyChanged)
     
     
            TextBox3.DataBindings.Add("Text", bindingSource2, "champCle2", True, DataSourceUpdateMode.OnPropertyChanged)
            TextBox4.DataBindings.Add("Text", bindingSource2, "champ2", True, DataSourceUpdateMode.OnPropertyChanged)
            TextBox5.DataBindings.Add("Text", bindingSource2, "champ3", True, DataSourceUpdateMode.OnPropertyChanged)
    Est ce à dire que je n' aurais donc plus besoin de cette déclaration?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim parentCol As DataColumn

    encore une question de newbie STP.
    à quoi me sert le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim BindingNavigator1 As New BindingNavigator(True)
    mon BindingNavigator1 me vient de la boîte à outils. Dois-je encore le déclarer ici?
    Mais en tout cas MERCI ca me rebouste le moral.

  6. #6
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    Merci infiniment ca fonctionne super bien!!!!

    oublie toutes les questions de mon précédent post. J' y ai trouvé des réponses au fur et à mesure que je codais.

    SUPER.

    une petite chose que j' ai par contre trouvé bizzare (mais que j' ai heureusement pu contourné.) . Etant donné que je suis entraint d 'apprendre
    je me réjouirai tt de même d' avoir la réponse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Relation2
            parentCol = ClientCommandesProductSet.Tables("TableChild1").Columns("champCle2")
            childCol = ClientCommandesProductSet.Tables("TableChild2").Columns("champCle2")
            Dim relat2 As New DataRelation("Relat2", parentCol, childCol) 'j' obtiens une erreur du type ArgumentException non traité
                   'la colonne(childCol) appartient à une table.
    J' ai fait la déclaration en une ligne du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Rel2 as New DataRelation("parentenf2", ds.Tables("Parent").Columns("ID"), ds.Tables("Enf2").Columns("enf2ID"))
    j' comprends po. mais ca marche! Pourquoi pas la même erreur sur la Rel1.
    le but premier de ce message est tout d' abord MERCI!!!

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    re

    cette ligne ne peut fonctionner parce que toi tu es dans le scenario du Nota-Bene:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Dim relat2 As New DataRelation("Relat2", parentCol, childCol) 'j' obtiens une erreur du type ArgumentException non traité
                   'la colonne(childCol) appartient à une table.
    et tu as corrige la relation 2 en consequence....c'est bon...

    bon code...

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

Discussions similaires

  1. Migration table Mysql avec relation parent/enfant
    Par danidan75 dans le forum Installation, migration et administration
    Réponses: 0
    Dernier message: 05/08/2011, 22h38
  2. Relation Parent/Enfant - Enfant/Parent
    Par zax-tfh dans le forum Services Web
    Réponses: 1
    Dernier message: 02/03/2010, 17h30
  3. Réponses: 1
    Dernier message: 23/11/2007, 12h04
  4. Réponses: 1
    Dernier message: 27/07/2007, 08h45
  5. relation Parent/Enfant sur la meme table et requete SQL
    Par tatayoyo dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/04/2007, 18h57

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