• Aucun résultat trouvé

Elle se manipule avec les mêmes méthodes que DataTableCollection.

Méthode Add

Surchargée. Comme d'habitude vous pouvez soit créer une relation puis l'ajouter à la collection, soit utiliser une des syntaxes surchargées de création directe.

Public Function Add(ByVal name As String, ByVal parentColumns() As DataColumn, ByVal

childColumns() As DataColumn, ByVal createConstraints As Boolean) As DataRelation

Le nom est facultatif.

CreateConstraint permet de créer implicitement la contrainte de clé étrangère sur la table enfant. ParentColumn et ChildColumn peuvent être soit un tableau de DataColumn, soit un seul DataColumn.

U

Propriétés de DataRelation

ChildColumns (DataColumn())

Renvoie un tableau d'objet DataColumn (ou un seul DataColumn) composant la clé étrangère de la table enfant.

ChildKeyConstraint (ForeignKeyConstraint)

Renvoie l'objet ForeignKeyConstraint de la relation.

ChildTable (DataTable)

Renvoie la table enfant.

ParentColumns, ParentTable, ParentKeyConstraint

Fonctionne comme les propriétés précédentes pour les objets parents. Dans le cas de ParentKeyConstraint c'est un objet UniqueConstraint qui est renvoyé.

Nested (Booléen)

Renvoie vrai si les objets DataRelation sont imbriqués. Cette propriété est utilisée lorsqu'on écrit un fichier XML ou pour synchroniser un XMLDataDocument avec le Dataset.

<CustomerOrders> <Customers> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> </Customers> <Customers> <CustomerID>ANATR</CustomerID>

<CompanyName>Ana Trujillo Emparedados y helados</CompanyName> </Customers> <Orders> <OrderID>10643</OrderID> <CustomerID>ALFKI</CustomerID> <OrderDate>1997-08-25T00:00:00</OrderDate> </Orders> <Orders> <OrderID>10692</OrderID> <CustomerID>ALFKI</CustomerID> <OrderDate>1997-10-03T00:00:00</OrderDate> </Orders> <Orders> <OrderID>10308</OrderID> <CustomerID>ANATR</CustomerID> <OrderDate>1996-09-18T00:00:00</OrderDate> </Orders> </CustomerOrders>

Notez que l'élément Customers et les éléments Orders sont représentés en tant qu'éléments frères. Si vous souhaitiez que les éléments Orders apparaissent comme les enfants de leurs éléments parents respectifs, il vous faudrait assigner la valeur true à la propriété Nested du DataRelation.

Le code suivant montre la sortie que vous obtiendriez, avec les éléments Orders imbriqués dans leurs éléments parents respectifs.

<CustomerOrders> <Customers> <CustomerID>ALFKI</CustomerID> <Orders> <OrderID>10643</OrderID> <CustomerID>ALFKI</CustomerID> <OrderDate>1997-08-25T00:00:00</OrderDate> </Orders> <Orders> <OrderID>10692</OrderID> <CustomerID>ALFKI</CustomerID> <OrderDate>1997-10-03T00:00:00</OrderDate> </Orders> <CompanyName>Alfreds Futterkiste</CompanyName> </Customers> <Customers> <CustomerID>ANATR</CustomerID> <Orders> <OrderID>10308</OrderID> <CustomerID>ANATR</CustomerID> <OrderDate>1996-09-18T00:00:00</OrderDate> </Orders>

<CompanyName>Ana Trujillo Emparedados y helados</CompanyName> </Customers>

Les classes DataView & DataViewManager

Jusque là, je ne vous ai pas tellement parlé de navigation dans les données ni de contrôles dépendants. Beaucoup de développeurs ADO sont pourtant perturbés par la disparition des méthodes de navigation de l'objet Recordset. Si ces méthodes avaient un sens dans un recordset qui gère une position courante, elle n'en a plus dans un Dataset qui est un ensemble de collections. En effet, la ligne en cours d'une collection n'est jamais qu'une position ordinale et naviguer dans une collection ne revient qu'à modifier celle-ci.

Les objets DataView sont une couche entre les objets DataTable et l'interface utilisateur. Elles permettent de présenter la table sous-jacente comme on veut. Une table peut exposer plusieurs vues d'elle- même. Un DataView est lié dynamiquement à la table, ce qui veut dire qu'il reflète les données et les changements apportés à la table.

Il ne faut pas confondre un DataView et une vue au sens SQL du terme. Un DataView ne peut exposer que des données provenant d'une seule table, ne peut pas créer de colonne de calcul et ne peut pas restreindre les colonnes affichées.

Un DataViewManager permet de gérer les paramètres des vues de toutes les tables au niveau du Dataset. En lui-même il ne fait rien de bien particulier si ce n'est permettre d'afficher des données connexes dans des contrôles dépendants.

Je vous parlais un peu plus avant de navigation dans le jeu d'enregistrement.

La navigation au sens ADO du terme se gère par l'intermédiaire du DataBinding. Non parce que ce n'est pas possible de faire autrement pour naviguer dans les enregistrements, mais parce que c'est la méthode pour pouvoir lier à la conception des contrôles dépendants gérant la navigation. La navigation dans une collection ne pose aucun problème. Regardons le code suivant :

Private MaTable As New Data.DataTable Private MaLigne As Data.DataRowView Private monIndex As Integer

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim strConn, strSQL As String

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:\tutoriel\biblio.mdb;"

strSQL = "SELECT * FROM Authors"

Dim MonDAPublisher As New Data.OleDb.OleDbDataAdapter(strSQL, strConn)

Dim MonDataset As New DataSet("Pubs") MonDAPublisher.Fill(MonDataset, "Auteurs") MaTable = MonDataset.Tables(0)

maTable.Constraints.Add("pk1", maTable.Columns(0), True) monIndex = 0

Call Affiche_Donnee() End Sub

Private Sub Btn_Del_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Del.Click

MaTable.Rows.RemoveAt(monIndex) End Sub

Private Sub cmdFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFirst.Click

monIndex = 0

Call Affiche_Donnee() End Sub

Private Sub Affiche_Donnee()

MaLigne = MaTable.DefaultView.Item(monIndex) Me.TextBox1.Text = MaLigne.Item(0)

Me.TextBox2.Text = MaLigne.Item(1) Me.TextBox3.Text = MaLigne.Item(2) & "" End Sub

Private Sub cmdNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdNext.Click

monIndex += 1

Call Affiche_Donnee() End Sub

Private Sub cmdPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdPrev.Click

monIndex -= 1

Call Affiche_Donnee() End Sub

Private Sub cmdLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLast.Click

monIndex = MaTable.DefaultView.Count - 1 Call Affiche_Donnee()

End Sub

Vous verrez que le code fonctionne très bien même si je retire des lignes de la table. Cela vient du fait que le DataView gère toujours correctement ces index.

U