Bonjour,

Voila j'ai un problème qui me semble tellement "bête" que j'ai du mal à croire que personne n'ai pas déjà séché dessus.
Je m'explique, pour l'exemple je reprends la bonne vielle base comptoir.mdb de Microsoft. Comme ça si qq veut le faire c pas bien compliqué.

J'ai utilisé les assistants pour créer une connexion et un DataSet sur la base Access. Dans mon DataSet je prens que les tables Produit et Catégorie lié par une relation.

Je souhaite afficher la liste de tous les produits sur mon formulaire.
Je glisse donc depuis la fenêtre "sources de données" la table "Products".
Je prends soins de prendre la table qui est indépendante et non pas celle "filtrée" par catégorie.
J'ai donc sur mon formulaire un BindingNavigator, et toute une série de txtBox.
Ca se lance tout est OK.

Mais voila je me retrouve à afficher le CategoryId ce qui n'est trés élégant.
Je me dis donc tiens je vais remplacer ça par une combobox renseignée de la sorte :

DataSource = CategoriesBindingSource
DisplayMember = CategoryName
SelectValue lié à ProductsBindingSource - CategoryID

Sur le formulaire j'ai donc un CategoriesBindingSource qui apparaît avec le TableAdapter qui va avec.
Tout est OK, quand je navigue dans mes Product ma combo se 'cale' bien sur la bonne Catégorie et je peux la modifier.

Et puis je me dis, l'utilisateur n'a pas besoin de toucher à cette donnée, l'ideal serait d'afficher le libelle de catégorie dans un bon vieux label.
Et la... c'est le drame...

Impossible de faire en sorte que le label se cale sur la bonne catégorie, ce qui se comprend car il n'a pas de liste sous jacente.

La solution que j'ai trouvée c'est de lier la propriété texte de mon label à CategoriesBindingSource - CategoryName et d'aller me caler sur le bon enregistrement via du code en gérant ProductsBindingSource.CurrentChanged :

Private Sub ProductsBindingSource_CurrentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ProductsBindingSource.CurrentChanged

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
    Private Sub ProductsBindingSource_CurrentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ProductsBindingSource.CurrentChanged
 
        '//Cas où il n'y a pas d'enrgistrement
        If Not IsNothing(Me.ProductsBindingSource.Current) Then
            Me.CategoriesBindingSource.Filter = "CategoryID = " & CType(Me.ProductsBindingSource.Current, Data.DataRowView).Item("CategoryID").ToString
        End If
 
    End Sub
Existe-il une autre solution ? Pour éviter d'écrire ce code ?
Merci de vos conseils.