2010-09-21 3 views
4

Salut tout le monde! Je suppose que c'est mon premier article sur StackOverFlow.com :-)Problème de liaison C# DataGridViewComboBoxColumn

J'ai eu ce problème pendant un moment. Pour faire tout simple, supposons que nous avons 2 tables de base de données nommée "livres" et "catégories" avec le schéma suivant:

livres (id, titre, CatID)
catégories (id, catName)

Il est évident que le « catId » champ dans les « livres » Table est une clé étrangère et exige une catégorie qu'un livre appartient.

J'ai créé les classes LinQ à Sql nécessaires et créé l'objet bindingSource nécessaire. Ce que j'essaie de faire est d'afficher tous les livres dans un objet DataGridView. Je veux qu'il ait une colonne nommée "Catégorie" qui est du type DataGridViewComboBoxColumn contenant toutes les catégories existantes et pour chaque livre affiche la catégorie à laquelle le livre spécifique appartient. L'utilisateur peut réaffecter la catégorie d'un livre en choisissant une autre catégorie dans la zone de liste déroulante.

J'ai réussi à faire exactement ce que je veux avec un ComboBox et il fonctionne comme je le veux. Mais quand il s'agit de la DataGridView je ne peux pas comprendre.

Toute aide serait grandement appréciée j'ai passé des jours à trouver quelque chose, mais pas de chance jusqu'à présent :-(

Répondre

8

Cela devrait fonctionner:

// create the column (probably better done by the designer) 
DataGridViewComboBoxColumn categoryColumn = ... 


// bind it 
categoryColumn.DataSource = db.Categories.ToList(); 
categoryColumn.DisplayMember = "catName"; // display category.catName 
categoryColumn.ValueMember = "id";   // use category.id as the identifier 
categoryColumn.DataPropertyName = "catId"; // bind the column to book.catId 
+0

WOW je ne peux pas le croire Cela a fonctionné comme je le souhaitais Merci beaucoup Le truc, c'est que j'ai passé d'innombrables heures à jouer avec ces propriétés, je les ai toutes réglées, mais aucune n'a fonctionné ... Devine le problème que j'avais avec la "DataSource" J'ai mis J'ai utilisé un LinQ pour les sélectionner et cela n'a pas fonctionné. d's faire toute la magie! :-) Vous voulez expliquer ce que nous faisons exactement ici? Je confond toujours "DisplayMember" avec "DataPropertyName". :-p Encore une fois merci beaucoup pour votre réponse précise :-) – M2X

+0

DataPropertyName est une propriété commune à toutes les colonnes DGV. C'est le nom du membre de l'objet de données représenté par cette colonne. DisplayMember/ValueMember sont spécifiques à DataGridViewComboBoxColumn. Le représentant, respectivement, le membre utilisé pour afficher l'objet dans l'interface utilisateur et le membre qui est utilisé comme "valeur sélectionnée" du combo (notez que ces propriétés existent également pour d'autres contrôles comme ComboBox ou ListBox) –

+0

Merci pour le explication! "DataPropertyName" est défini sur "catId" qui est une propriété d'un "livre". La "DataSource" de "categoryColumn" est affectée à "Categories". Comment cela fonctionne-t-il exactement? AFAIK nous disons au compilateur que "categoryColumn" est lié à "catId" de "Books". Mais où est le lien entre "categoryColumn" et "Books"?! – M2X