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字段。

这是一个快速的步骤:

  1. 删除网格中的“ Product列; 只保留ProductID

  2. ProductID列的ColumnType属性更改为DataGridViewComboBoxColumn

  3. 将此列的DataSource更改为新的BindingSource ,并将DataSource设置为MyProject.Product (您可以按照向导进行操作,可能与对网格本身一样,但使用Product而不是License )。

  4. 将此列的DisplayMember更改为要在combobox中显示的任何文本,例如ProductName

  5. ValueMember更改为实际的主键,例如ProductID

  6. 填充GridView本身之前 ,使用产品数据初始化新的productsBindingSource ,即使用productBindingSource.DataSource = context.Products;

而已。 现在当您SubmitChanges (假设您一直打开DataContext ),它将使用正确的引用更新ProductID 。 请注意,它可能不会更新它保存的类的Product引用; 如果你因任何原因需要使用实际的实体引用,那么你可能需要首先调用它上面的DataContext.Refresh方法。 但除非您需要在网格外部使用实体类,否则不要担心这一点。