c# - DataGridView 中外键的组合框

标签 c# winforms linq datagridview

我有一个包含两个表的数据库,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 字段。

这是一个快速的分步说明:

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

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

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

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

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

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

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

关于c# - DataGridView 中外键的组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2256924/

相关文章:

c# - 如何在同一 Controller 内的另一个 Action 中返回主视图?

c# - 表单加载后取消异步操作?

c# - 从通用列表中查找项目

c# - 最佳实践 : Pros and Cons for using AutoMapper or LINQ (LINQ to Objects) for mapping between a Domain Model and a Presentation Model

c# - 从 C# 切换到 C++。有什么必读的吗?

c# - 覆盖 AspNetCore.Identity 表中的默认索引

c# - IsXValueIndexed 导致图形线条无法绘制

c# - 使用 Entity Framework 作为 DataGridView 的数据源的正确方法是什么?

c# - 如何使用linq过滤类列表中的列表?

c# - 以毫秒为单位创建日志