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