首页 > 解决方案 > 如何根据从 SQL Server 获取的 ID 设置 ComboBox 初始 DisplayMember 以显示正确的项目

问题描述

我编写了一个从 SQL Server 获取所有数据的 Windows 窗体应用程序。

第一个表格显示DataGridView带有Receipts,每张收据都有其 ID 号、名称Status,可以是ActivePaid

ID | Name      | Status
---+-----------+----------
1  | Receipt22 | Active

当从 中选择收据DataGridView并单击“编辑”按钮时,它将提示第二种形式,其中显示该收据的所有项目/产品。

现在,我的问题是,我成功地用 Products 表中的所有项目填充了 ComboBox,但我需要做什么。是将一行的初始DisplayMember设置为已选择的Item的初始DisplayMember。

因此,例如,如果“Receipt1”有产品“1,2,2,3,4,1”,它应该在每一行中显示一个 ComboBox,其中初始值成员等于产品的 ID。

using (SqlConnection sqlCon = new SqlConnection(ConnectionStringHelper.ConString("Name")))
{
    SqlDataAdapter sdr = new SqlDataAdapter("Select * from Products", sqlCon);

    DataTable dt = new DataTable();
    sdr.Fill(dt);

    txtComboProducts.ValueMember = "ProductsID";
    txtComboProducts.DisplayMember = "ProductName";
    txtComboProducts.DataSource = dt;
}

这就是我填充 ComboBox 本身的方式,但我不知道如何根据与收据对应的项目显示和添加一行。

所以,在这种情况下,项目将是“1,2,2,3,4,1”,假设 1 = 水,2 = 果汁,3 = 糖果,4 = 蛋糕

Products(this is the comboBox) | Quantity |
-------------------------------+----------+
Water                                2        
Juice                                1        
Juice                                2       
Candy                                5 
Cake                                 1
Water                                4  

现在,如果我想更改第 1 行,我可以选择组合框并将其更改为列表中的其他产品。

主要问题是,我不知道如何设置初始 DisplayMember 以及如何为每个项目添加新行。

有没有人有任何想法或建议?将不胜感激。

标签: c#sqldatagridviewcombobox

解决方案


DisplayMember是要显示的字段的名称,并且将始终保持不变(例如产品名称)。

您至少需要三个表。将产品分配给收据的一个Receipts表、一个Products表和一个连接表。让我们称之为ReceiptProducts

然后要填充组合框,您必须执行如下查询

SELECT rp.ProductsID, p.ProductName
FROM
    ReceiptProducts rp
    INNER JOIN Products p
        ON rp.ProductsID = p.ProductsID
WHERE
    rp.ReceiptsID = 7  -- Assuming that this is the id of your current receipt
ORDER BY
    rp.Sorting

表:

  • 收据(PK ReceiptsID、ReceiptName、描述等)
  • 产品(PK ProductsID、ProductName)
  • ReceiptProducts(PK ReceiptProductsID、FK ReceiptsID、FK ProductsID、数量、单位、排序)

如果要在组合框中为每个数据网格行显示不同的项(这与 无关),请在DataGridView.RowEnter 事件DisplayMember中加载组合框项。


推荐阅读