4 tables parentes-filles en cascade
bonjour Multiprospere
Helas ,mpn ami le datagridview ne permet pas par un binding simple d'afficher des tables parent-fille en cascading comme dans ton cas.
Mais myennant la classe datarow et sa fonctions GetParentRow on peut reconstituer u datagridview par code qui affiche ce que tu veux savoir:
-table etudiant ->champ nomClasse->champ nomDepartement ->champ nomFaculte pour des fins de navigation seulement(le binding et maj des 4 datables doit etre gere par toi en code)....
1er exemple illustre datarow et sa fonction GetChildRows(note le pluriel) ou comment recuperer les enreg. multiples d'une table fille lie par foreign cle à une table parente.La relation parent-fille et les cles primaires sont definis par code pour plus de clarte
Code:
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 69 70 71 72 73 74 75 76 77 78 79 80
|
'exemple illustrant relation entre 2 DataTable Classe(parent) et Etudiant(fille)
'Utilise DataRow et GetChildRows pour renvoyer les enreg. de DataTable Fille
'Combobox sur DataTable (parent)
'DataGridView sur DataTable (fille)
'Supprimer pour cet exemple les cles primaires rajoutes par Designer XSD
'Elles sont definies par code.
'Idem pour les relations
Public Class FormSimple
Public Sub New()
'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
'set ComboBox cboClasse
Me.cboClasse.DataSource = Me.BdEtudiantDS1.Classe
Me.cboClasse.DisplayMember = Me.BdEtudiantDS1.Classe.Columns("Nom_Classe").ColumnName
Me.cboClasse.ValueMember = Me.BdEtudiantDS1.Classe.Columns("ID_Classe").ColumnName
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Cles primaires sur les 2 tables Etudiant et Classe
' Attention Desactiver constraintes .
Me.BdEtudiantDS1.EnforceConstraints = False
Dim PrimaryKeyColumns(1) As DataColumn
PrimaryKeyColumns(0) = Me.BdEtudiantDS1.Etudiant.Columns.Item("Numero")
PrimaryKeyColumns(0).Unique = True
Me.BdEtudiantDS1.Etudiant.PrimaryKey = PrimaryKeyColumns
PrimaryKeyColumns(0) = Me.BdEtudiantDS1.Classe.Columns.Item("ID_Classe")
PrimaryKeyColumns(0).Unique = True
Me.BdEtudiantDS1.Classe.PrimaryKey = PrimaryKeyColumns
'Relations
Dim maRelation As DataRelation
'Add Relations Classe parent ->Etudiant fille
maRelation = New DataRelation("relClasseEtudiant", _
Me.BdEtudiantDS1.Tables("Classe").Columns("ID_Classe"), _
Me.BdEtudiantDS1.Tables("Etudiant").Columns("ID_Classe"), True)
Me.BdEtudiantDS1.Relations.Add(maRelation)
' Fill the tables with data.
Me.EtudiantTableAdapter1.Fill(BdEtudiantDS1.Etudiant)
Me.ClasseTableAdapter1.Fill(BdEtudiantDS1.Classe)
' Active constraintes.
Me.BdEtudiantDS1.EnforceConstraints = True
Me.DataGridViewEtudiant.DataSource = Me.BdEtudiantDS1
Me.DataGridViewEtudiant.DataMember = Me.BdEtudiantDS1.Etudiant.TableName
End Sub
Private Sub cbEtudiant_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboClasse.SelectedIndexChanged
If Me.cboClasse.SelectedValue Is Nothing Then Return
' un string pour ID_Classe Classe selectionne .
Dim SelectedIDClasse As String
SelectedIDClasse = Me.cboClasse.SelectedValue.ToString()
'Declare a data row to hold the selected Classe's record.
Dim drSelectedClasse As DataRow
drSelectedClasse = _
Me.BdEtudiantDS1.Classe.Rows.Find(SelectedIDClasse)
' Declare an array of data rows to hold the related records.
Dim draEtudiants() As DataRow
draEtudiants = drSelectedClasse.GetChildRows("relClasseEtudiant", DataRowVersion.Current)
' Display the length of the array (number of etudiants)
' and the IDClasse in the form caption.
Me.Label1.Text = draEtudiants.Length.ToString() & " etudiants for " & _
SelectedIDClasse
' When the selected classe changes, clear the DataGridViewEtudiant.
Me.DataGridViewEtudiant.DataSource = draEtudiants
End Sub
End Class |
fichier .mdb :bdEtudiant.mdb ci-joint......
Le 2eme exemple plus complexe (ton souci) comporte nos 4 tables Etudiant,Classe,Departement et Faculte et utilise la fonction GetParentRow(note le singulier) pour recuperer la colonne parente de Etudiant,de Classe,de Departement (faculte est l'ancetre commun)......
Code:
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
'FormRelationComplexe utilise tes 4 tables
'Ci-joint BD MDB qui donne le detail des tables BD avec cles externes etrangeres
'ou foreing key.
'Le DGV DataGridViewSelEtudiant de l'etudiant selectionne est construit
'par code dans le selectedindex du ComboBox cboEtudiant
'car il n' y a aucun moyen de l'avoir par binding
'
Public Class FormRelationComplexe
Public Sub New()
' Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
'set ComboBox cboClasse
Me.cboEtudiant.DataSource = Me.BdEtudiantDS1.Etudiant
Me.cboEtudiant.DisplayMember = Me.BdEtudiantDS1.Etudiant.Columns("Nom").ColumnName
Me.cboEtudiant.ValueMember = Me.BdEtudiantDS1.Etudiant.Columns("Numero").ColumnName
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' Attention Desactiver constraintes .
Me.BdEtudiantDS1.EnforceConstraints = False
'Cles primaires sur les 4 tables
Dim PrimaryKeyColumns(1) As DataColumn
PrimaryKeyColumns(0) = Me.BdEtudiantDS1.Etudiant.Columns.Item("Numero")
PrimaryKeyColumns(0).Unique = True
Me.BdEtudiantDS1.Etudiant.PrimaryKey = PrimaryKeyColumns
PrimaryKeyColumns(0) = Me.BdEtudiantDS1.Classe.Columns.Item("ID_Classe")
PrimaryKeyColumns(0).Unique = True
BdEtudiantDS1.Classe.PrimaryKey = PrimaryKeyColumns
PrimaryKeyColumns(0) = Me.BdEtudiantDS1.Departement.Columns.Item("ID_Departement")
PrimaryKeyColumns(0).Unique = True
BdEtudiantDS1.Departement.PrimaryKey = PrimaryKeyColumns
PrimaryKeyColumns(0) = Me.BdEtudiantDS1.Faculte.Columns.Item("ID_Faculte")
PrimaryKeyColumns(0).Unique = True
BdEtudiantDS1.Faculte.PrimaryKey = PrimaryKeyColumns
'Relations
Dim maRelation As DataRelation
'Add Relations Classe parent ->Etudiant fille
maRelation = New DataRelation("relClasseEtudiant", _
Me.BdEtudiantDS1.Tables("Classe").Columns("ID_Classe"), _
Me.BdEtudiantDS1.Tables("Etudiant").Columns("ID_Classe"), True)
Me.BdEtudiantDS1.Relations.Add(maRelation)
'Add Relations Departement parent ->Classe fille
maRelation = New DataRelation("relDepartementClasse", _
Me.BdEtudiantDS1.Tables("Departement").Columns("ID_Departement"), _
Me.BdEtudiantDS1.Tables("Classe").Columns("ID_Departement"), True)
Me.BdEtudiantDS1.Relations.Add(maRelation)
'Add Relations Faculte parent ->Departement fille
maRelation = New DataRelation("relFaculteDepartement", _
Me.BdEtudiantDS1.Tables("Faculte").Columns("ID_Faculte"), _
Me.BdEtudiantDS1.Tables("Departement").Columns("ID_Faculte"), True)
Me.BdEtudiantDS1.Relations.Add(maRelation)
'Load the DataSet
Call FillDataSet()
' Active constraintes.
Me.BdEtudiantDS1.EnforceConstraints = True
'Lie DataGridViewClasse, DataGridViewDepartement &
'DataGridViewClasse aux tables concernees pour ce test seulement
Me.DataGridViewClasse.DataSource = Me.BdEtudiantDS1
Me.DataGridViewClasse.DataMember = Me.BdEtudiantDS1.Classe.TableName
'DataGridViewDepartement
Me.DataGridViewdDepartement.DataSource = Me.BdEtudiantDS1
Me.DataGridViewdDepartement.DataMember = Me.BdEtudiantDS1.Departement.TableName
'DataGridViewFaculte
Me.DataGridViewFaculte.DataSource = Me.BdEtudiantDS1
Me.DataGridViewFaculte.DataMember = Me.BdEtudiantDS1.Faculte.TableName
'Ajout colonnes de DataGridViewsSelEtudiant pour affichage(celui demande par toi)
For Each col As DataColumn In Me.BdEtudiantDS1.Etudiant.Columns
Me.DataGridViewSelEtudiant.Columns.Add(col.ColumnName, col.ColumnName)
Next
'ajout 3 colonnes parentes
Me.DataGridViewSelEtudiant.Columns.Add("Nom_Classe", "Nom_Classe")
Me.DataGridViewSelEtudiant.Columns.Add("Nom_Departement", "Nom_Departement")
Me.DataGridViewSelEtudiant.Columns.Add("Nom_Faculte", "Nom_Faculte")
End Sub
Public Sub FillDataSet()
' Fill les 4 tables Etudiant,Classe,Departement,Faculte with data.
Me.EtudiantTableAdapter1.Fill(BdEtudiantDS1.Etudiant)
Me.ClasseTableAdapter1.Fill(BdEtudiantDS1.Classe)
Me.DepartementTableAdapter1.Fill(BdEtudiantDS1.Departement)
Me.FaculteTableAdapter1.Fill(BdEtudiantDS1.Faculte)
End Sub
Private Sub cboEtudiant_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboEtudiant.SelectedIndexChanged
If Me.cboEtudiant.SelectedValue Is Nothing Then Return
' un string pour Numero Etudiant selectionne .
Dim SelectedNumeroEtudiant As String
SelectedNumeroEtudiant = Me.cboEtudiant.SelectedValue.ToString()
' Display item NumeroEtudiant from Etudiant in the label .
Me.lblNumeroEtudiant.Text = " => " & SelectedNumeroEtudiant
'un datarow pour l'enreg. de Etudiant selectionne.
Dim drSelectedEtudiant As DataRow
drSelectedEtudiant = _
Me.BdEtudiantDS1.Etudiant.Rows.Find( _
(SelectedNumeroEtudiant))
'un datarow pour recuperer l'enreg. relie dans Classe parente.
Dim draClasse As DataRow
draClasse = drSelectedEtudiant.GetParentRow("relClasseEtudiant")
'Retrieve Departement parent de Classe
' un string pour ID_Departement de Classe .
Dim strIDDepartement As String
strIDDepartement = draClasse.Item("ID_Departement").ToString()
' un datarow pour l'enreg. du Departement selectionne.
Dim drSelectedDepartement As DataRow
drSelectedDepartement = _
Me.BdEtudiantDS1.Departement.Rows.Find( _
(strIDDepartement))
'Retrieve Faculte parent de Departement
' un datarow pour recuperer l'enreg. relie dans Faculte.
Dim drFaculte As DataRow
drFaculte = drSelectedDepartement.GetParentRow("relFaculteDepartement")
'Populate DataGridViewEtudiant(notre dgv oiseau rare)
For Each drvRow As DataGridViewRow In Me.DataGridViewSelEtudiant.Rows
For I As Integer = 0 To drSelectedEtudiant.ItemArray.Count - 1
drvRow.Cells.Item(I).Value = drSelectedEtudiant.Item(I).ToString
Next
drvRow.Cells.Item("Nom_Classe").Value = draClasse.Item("Nom_Classe").ToString()
drvRow.Cells.Item("Nom_Departement").Value = drSelectedDepartement("Nom_Departement").ToString
drvRow.Cells.Item("Nom_Faculte").Value = drFaculte.Item("Nom_Faculte").ToString()
Next
End Sub
End Class |
le fichier .mdb est le meme pour les 2 exemples....
bon code................