DataGridView中的外键组合框

pet*_*hen 8 c# linq datagridview winforms

我有一个包含两个表,产品和许可证的数据库.Licences.ProductID有外键引用Products.ProductID(即该产品的许可证).

如何在WinForms DataGridView中表示该关系?

在向DataGridView(SQL Metal和通过LINQ to SQL)提供ProductLicences.ProductID时,它会自动生成一个包含文本字段的列,该字段需要"Product"(当然我无法输入...).

如何更改此列以包含列出可用产品的组合框?


我有一个连接(继承自Linq.DataContext),分配给DataGridView的数据源是a Link.IQueryable,生成如下:

var ds = from c in m_connection.Licences
    select c;
Run Code Online (Sandbox Code Playgroud)

Aar*_*ght 13

在这种情况下,您尝试模仿的行为是Lookup Combo.您不想使用该类的Product字段License,您实际上想要使用该ProductID字段.

这是一个快速的步骤:

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

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

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

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

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

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

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