Bonjour,

J'ai récemment posté à propos d'un problème d'arborescence.
J'ai réussi à résoudre ce problème. Maintenant, malgré la relation N-à-N qui me gênait, j'ai un DGV regroupant les familles, qui donne tous les fournisseurs qui y sont attachés (dans un autre DGV) quand je sélectionne une famille.
Je me suis débrouillé avec quelques tutos et voici mon code:

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Imports System.Data.SqlClient
Imports system.ComponentModel
Imports System.Text
Public Class frmCourses
    Private bsFamille As BindingSource
    Private bsFournisseur As BindingSource
    Private ds As DataSet
    Public Sub New()
        InitializeComponent()
        ' charger les données
        LoadData()
        ' Lier les datagridview aux bindingsources
        Me.dgvFournisseur.DataSource = bsFournisseur
        Me.dgvFamille.DataSource = bsFamille
        ' Gérer l'événement de changement de position de bsFamille
        AddHandler bsFamille.PositionChanged, AddressOf bsFamille_OnPositionChanged
    End Sub
 
    Private Sub frmFamille_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' on filtre les fournisseurs au chargement
        Me.FiltrerFournisseur()
    End Sub
    Private Sub LoadData()
        ' charger les données dans le dataset
        ds = New DataSet
        Using con As New SqlConnection(My.Settings.RepertoireConnectionString)
            Using da As New SqlDataAdapter("SELECT * FROM Famille", con)
                da.Fill(ds, "Famille")
            End Using
            Using da As New SqlDataAdapter("SELECT * FROM Fournisseur", con)
                da.Fill(ds, "Fournisseur")
            End Using
            Using da As New SqlDataAdapter("SELECT * FROM FamilleFournisseur", con)
                da.Fill(ds, "FamilleFournisseur")
            End Using
        End Using
        ' Créer les relations
        Dim relation As DataRelation
        relation = New DataRelation("relationFournisseur_FamilleFournisseur", _
                                           ds.Tables("Fournisseur").Columns("idFournisseur"), _
                                           ds.Tables("FamilleFournisseur").Columns("idFournisseur"))
        Me.ds.Relations.Add(relation)
        relation = New DataRelation("relationFamille_FamilleFournisseur", _
                                                   ds.Tables("Famille").Columns("idFamille"), _
                                                   ds.Tables("FamilleFournisseur").Columns("idFamille"))
        Me.ds.Relations.Add(relation)
        ' Bind les bindingsource aux données
        bsFamille = New BindingSource
        bsFamille.DataSource = ds
        bsFamille.DataMember = "Famille"
        bsFournisseur = New BindingSource
        bsFournisseur.DataSource = ds
        bsFournisseur.DataMember = "Fournisseur"
    End Sub
    Private Sub bsFamille_OnPositionChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        ' Filtrer les fournisseurs pour la famille courante
        Me.FiltrerFournisseur()
    End Sub
    Private Sub FiltrerFournisseur()
        ' on vérifie qu'il y a bien au moins une famille
        If ds.Tables("Famille").Rows.Count > 0 Then
            Dim strFilter As New StringBuilder
            ' on récupère la clef primaire de la famille courante
            Dim idFamille As String = CType(bsFamille.Current, DataRowView).Item("idFamille").ToString
            ' on crée le filtre pour les fournisseurs
            For Each row As DataRow In ds.Tables("FamilleFournisseur").Rows
                If row("idFamille").ToString = idFamille Then
                    If strFilter.Length > 0 Then
                        strFilter.Append(" OR ")
                    End If
                    strFilter.Append("idFournisseur='" & row("idFournisseur").ToString & "'")
                End If
            Next
            If strFilter.Length > 0 Then
                ' filtrer les fournisseurs qui font partie de la famille courante
                bsFournisseur.Filter = strFilter.ToString
            Else
                ' ne rien afficher si il n'y pas de fournisseur dans la famille
                bsFournisseur.Filter = "idFournisseur=''"
            End If
        End If
    End Sub
End Class

Cependant, lorsque je lance l'application, et également lorsque je sélectionne une famille ne contenant aucun fournisseur, j'obtient un message d'erreur:

Nom : Capture3.PNG
Affichages : 139
Taille : 40,2 Ko


Sauriez-vous comment résoudre ce problème ? Je suis à deux doigts de toucher au but, enfin.

Voici les tables concerné par le code:

Nom : Capture.PNG
Affichages : 131
Taille : 9,5 Ko

Merci d'avance !

Cordialement.