Overblog Suivre ce blog
Editer l'article Administration Créer mon blog
21 septembre 2007 5 21 /09 /septembre /2007 14:26

Pour cet exemple, nous allons prendre 3 tables dans une base de données :

Table Coureurs ayant les champs suivants :

  • pkCoureur (clef primaire GUID)
  • nomCoureur

Table Courses ayant les champs suivants :

  • pkCourse (clef primaire GUID)
  • nomCourse

Table CoureursCourses ayant les champs suivants :

  • pkCoureurCourse (clef primaire GUID)
  • fkCourse (clef étrangère GUID)
  • fkCoureur (clef étrangère GUID)

La table CoureursCourses permet de faire la relation entre les courses et les coureurs, ainsi, un coureur peut participer à plusieurs courses et une course peut être courue par plusieurs coureurs. Nous avons donc une relation de plusieurs à plusieurs.

Nous allons créer une fenêtre frmCourses dand laquelle nous allons mettre 2 DataGridView (dgvCourses et dgvCoureurs).

Voici comment procéder pour afficher les coureurs qui sont inscrit à une course :

Code :

Imports System.Data.SqlClient
Imports system.ComponentModel
Imports System.Text

Public Class frmCourses
    Private bsCourses As BindingSource
    Private bsCoureurs As BindingSource
    Private ds As DataSet

    Public Sub New()

        InitializeComponent()

       ' charger les données
        LoadData()

        ' Lier les datagridview aux bindingsources
        Me.dgvCoureurs.DataSource = bsCoureurs
        Me.dgvCourses.DataSource = bsCourses

        ' Gérer l'événement de changement de position de bsCourses
        AddHandler bsCourses.PositionChanged, AddressOf bsCourses_OnPositionChanged

    End Sub


    Private Sub frmCourses_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
       ' on filtre les coureurs au chargement
        Me.FiltrerCoureurs()
    End Sub

    Private Sub LoadData()
       ' charger les données dans le dataset
        ds = New DataSet
        Using con As New SqlConnection(My.Settings.dbCoursesConnectionString)
            Using da As New SqlDataAdapter("SELECT * FROM Courses", con)
                da.Fill(ds, "Courses")
            End Using
            Using da As New SqlDataAdapter("SELECT * FROM Coureurs", con)
                da.Fill(ds, "Coureurs")
            End Using
            Using da As New SqlDataAdapter("SELECT * FROM CoureursCourses", con)
                da.Fill(ds, "CoureursCourses")
            End Using
        End Using

        ' Créer les relations
        Dim relation As DataRelation

        relation = New DataRelation("relationCoureurs_CoureursCourses", _
                                           ds.Tables("Coureurs").Columns("pkCoureur"), _
                                           ds.Tables("CoureursCourses").Columns("fkCoureur"))
        Me.ds.Relations.Add(relation)

        relation = New DataRelation("relationCourses_CoureursCourses", _
                                                   ds.Tables("Courses").Columns("pkCourse"), _
                                                   ds.Tables("CoureursCourses").Columns("fkCourse"))
        Me.ds.Relations.Add(relation)

        ' Bind les bindingsource aux données
        bsCourses = New BindingSource
        bsCourses.DataSource = ds
        bsCourses.DataMember = "Courses"

        bsCoureurs = New BindingSource
        bsCoureurs.DataSource = ds
        bsCoureurs.DataMember = "Coureurs"

    End Sub

    Private Sub bsCourses_OnPositionChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        ' Filtrer les coureurs pour la course courante
        Me.FiltrerCoureurs()
    End Sub

    Private Sub FiltrerCoureurs()
        ' on vérifie qu'il y a bien au moins une course
        If ds.Tables("Courses").Rows.Count > 0 Then
            Dim strFilter As New StringBuilder
           ' on récupère la clef primaire de la course courante
            Dim pkCourse As String = CType(bsCourses.Current, DataRowView).Item("pkCourse").ToString

           ' on crée le filtre pour les coureurs
            For Each row As DataRow In ds.Tables("CoureursCourses").Rows
                If row("fkCourse").ToString = pkCourse Then
                    If strFilter.Length > 0 Then
                        strFilter.Append(" OR ")
                    End If
                    strFilter.Append("pkCoureur='" & row("fkCoureur").ToString & "'")
                End If
            Next

            If strFilter.Length > 0 Then
               ' filtrer les coureurs qui font partie de la course courante
                bsCoureurs.Filter = strFilter.ToString
            Else
                ' ne rien afficher si il n'y pas de coureurs dans la course
                bsCoureurs.Filter = "pkCoureur=''"
            End If
        End If
    End Sub

End Class

Partager cet article

Repost 0
Published by Cyril Hennebique - dans VB.NET
commenter cet article

commentaires