DataBridView中的外键combobox
我有一个包含两个表,产品和许可证的数据库。 Licences.ProductID
具有对Products.ProductID
的外键引用(即该产品的许可证)。
如何在WinForms DataGridView中表示该关系?
在向DataGridView(SQL Metal和通过LINQ to SQL)提供ProductLicences.ProductID时,它会自动生成一个包含文本字段的列,该字段需要“Product”(当然我无法输入…)。
如何更改此列以包含列出可用产品的combobox?
我有一个连接(inheritance自Linq.DataContext
),分配给DataGridView的数据源是一个Link.IQueryable
,生成如下:
var ds = from c in m_connection.Licences select c;
在这种情况下,您尝试模仿的行为是Lookup Combo。 您不想使用License
类的Product
字段,实际上您想要使用ProductID
字段。
这是一个快速的步骤:
-
删除网格中的“
Product
列; 只保留ProductID
。 -
将
ProductID
列的ColumnType
属性更改为DataGridViewComboBoxColumn 。 -
将此列的
DataSource
更改为新的BindingSource
,并将DataSource
设置为MyProject.Product
(您可以按照向导进行操作,可能与对网格本身一样,但使用Product
而不是License
)。 -
将此列的
DisplayMember
更改为要在combobox中显示的任何文本,例如ProductName
。 -
将
ValueMember
更改为实际的主键,例如ProductID
。 -
在填充
GridView
本身之前 ,使用产品数据初始化新的productsBindingSource
,即使用productBindingSource.DataSource = context.Products;
。
而已。 现在当您SubmitChanges
(假设您一直打开DataContext
),它将使用正确的引用更新ProductID
。 请注意,它可能不会更新它保存的类的Product
引用; 如果你因任何原因需要使用实际的实体引用,那么你可能需要首先调用它上面的DataContext.Refresh
方法。 但除非您需要在网格外部使用实体类,否则不要担心这一点。