2010-09-21 71 views
4

大家好!我想这是我在StackOverFlow.com上的第一篇文章:-)C#DataGridViewComboBoxColumn绑定问题

我一直有这个问题一段时间。 为了让这一切简单,假设我们有一个名为“书”“类别”下面的模式2个的数据库表:

书(ID,标题,CATID)
类别(ID, catName)

显然“CATID”“本本”表的外键,并指定一本书属于一个类别字段。

我已经创建了必要的LinQ to Sql类并创建了必要的bindingSource对象。 我想要做的是在DataGridView对象中显示所有书籍。我希望它有一个名为的“类别”列,其类型为DataGridViewComboBoxColumn包含所有现有类别,并且每本书都显示特定图书所属的类别。用户可以通过在组合框中选择另一个类别来重新分配书籍的类别。

我已经设法做到了我想要的组合框,它的工作原理与我想要的一样。 但是,当涉及到DataGridView我只是无法弄清楚。

任何帮助将不胜感激 我花了几天时间来想办法的,但至今没有运气:-(

回答

8

这应该工作:

// 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我简直不敢相信!它的工作方式就是我想要的,非常感谢你! 事情是我花了无数小时玩这些属性,我也设置了它们,但都没有成功 猜猜我遇到的问题是“DataSource”我设置了。 我用LinQ来选择它们,它不起作用。猜猜“ToList()”方法这些都是魔法! :-) 小心解释我们到底在做什么? 我总是会将“DisplayMember”与“DataPropertyName”混淆。 :-p 再次非常感谢您的精确答案:-) – M2X 2010-09-21 10:02:17

+0

DataPropertyName是所有DGV列的通用属性。它是由该列表示的数据对象成员的名称。 DisplayMember/ValueMember特定于DataGridViewComboBoxColumn。这些表示分别代表用于在UI中显示对象的成员以及用作组合框的“选定值”的成员(请注意,这些属性对于ComboBox或ListBox等其他控件也存在) – 2010-09-21 10:20:38

+0

感谢您说明! “DataPropertyName”设置为“catId”,它是“book”的属性。 “categoryColumn”的“DataSource”分配给“Categories”。 这是如何工作的? AFAIK我们告诉编译器,“categoryColumn”绑定到“Books”的“catId”。但“categoryColumn”和“Books”之间的链接在哪里? – M2X 2010-09-21 11:03:00