我有一个包含两个表的数据库,Products 和 Licences。 Licences.ProductID
具有对 Products.ProductID
的外键引用(即该产品的许可证)。
我如何在 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;
最佳答案
在这种情况下,您试图模仿的行为是查找组合。您不想使用 License
类的 Product
字段,您实际上想使用 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
方法。不过不用担心这个,除非你需要在网格外使用实体类。
关于c# - DataGridView 中外键的组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2256924/