2010-02-13 55 views
7

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

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

当向DataGridView(SQL Metal和LINQ to SQL),ProductLicences.ProductID提供时,它会自动生成一个带有期望产品的文本字段的列(当然,我无法输入......) 。

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


我有一个连接(从Linq.DataContext继承),分配到DataGridView数据源是一个Link.IQueryable,因为这样产生的:

var ds = from c in m_connection.Licences 
    select c; 

回答

11

在这种情况下,行为你正在试图模仿是一个查找组合。你不想使用License类的Product字段,你实际上想要使用ProductID字段。

下面就让我们一步一步:

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

  2. 更改ProductID列的ColumnType属性DataGridViewComboBoxColumn

  3. 更改此列的DataSource到一个新的BindingSource设置为MyProject.ProductDataSource(你可以按照向导,可能你做到了网格本身的方式相同,但使用Product代替License)。

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

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

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

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

+0

谢谢!这工作得很好。 – peterchen 2010-02-16 11:54:09

+0

如果许可证类只有产品字段而不是产品ID字段,该怎么办?(您不应该添加一个额外的ProductID字段,仅用于UI绑定的目的)IMO – 2011-05-09 15:47:56

+0

@goku:呃......如果天空陨落怎么办?在问题中指定该字段存在,并且它也是Linq to SQL的显式行为(也在问题中指定)。 – Aaronaught 2011-05-09 15:55:48