C# 如何根据从SQL Server获取的ID设置ComboBox initial DisplayMember以显示正确的项

C# 如何根据从SQL Server获取的ID设置ComboBox initial DisplayMember以显示正确的项,c#,sql,datagridview,combobox,C#,Sql,Datagridview,Combobox,我编写了一个Windows窗体应用程序,它从SQL Server获取所有数据 第一个表单显示了带有收据的DataGridView,每个收据都有其ID号、名称和状态,可以是活动的,也可以是支付的 当从DataGridView中选择收据并单击编辑按钮时,它将提示第二个表单,其中显示所述收据的所有项目/产品 现在,我的问题是,我成功地用Products表中的所有项目填充了ComboBox,但是我需要做什么呢。将行的初始DisplayMember设置为已选定项的初始DisplayMember 例如,如果

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

第一个表单显示了带有收据的DataGridView,每个收据都有其ID号、名称和状态,可以是活动的,也可以是支付的

当从DataGridView中选择收据并单击编辑按钮时,它将提示第二个表单,其中显示所述收据的所有项目/产品

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

例如,如果Receipt1有产品1,2,2,3,4,1,它应该在每行显示一个组合框,其中初始值成员等于产品的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;
}
这是我填写组合框本身的方式,但我不知道如何根据与收据对应的项目显示和添加行

所以,在这个例子中,项目是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以及如何为每个项目添加新行

有人有什么想法或建议吗?非常感谢。

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

你至少需要三张桌子。一个收据表、一个产品表和一个为收据分配产品的表。我们称之为ReceiptProducts

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

选择rp.ProductsID,p.ProductName 从…起 接收产品 内连接积 在rp.ProductsID=p.ProductsID上 哪里 rp.ReceiptsID=7-假设这是您当前收据的id 订购人 rp.分拣 表:

收据主键ReceiptsID、ReceiptName、说明等。 产品PK ProductsID,ProductName ReceiptProducts PK ReceiptProductsID,FK ReceiptsID,FK ProductsID,数量,单位,排序
如果要在组合框中为每个数据网格行显示不同的项目,这与DisplayMember无关,请在中加载组合框项目。

这些项目来自数据库,存储在临时数据表中,并作为数据源映射到组合框。因此,如果向数据库中添加项目,如果重新填充datatable,则会出现新项目。在这种情况下,您可能希望保留datatable和dataadapter,这样您就可以简单地刷新我忘记提到的数据表,我已经制作了一个ReceiptProducts表,它存储了所有这些信息。但一旦我接触到它并从中提取我需要的一切。我不知道如何实际排序。也就是说,如何将初始显示设置为显示购买的项目。如果订单不是按id或名称,请添加一个名为Sorting的列,其中包含所需的排序顺序,然后在查询中按排序添加订单。排序器:Water=1、Juice=2、Juice=3、Candy=4等。您可能应该在主/详细视图中的相关DataGridView中显示收据项目。像这样的。或者使用专门的控件。我已经更新了我的答案。想法是在RowEnter事件中重新加载组合框项。问题是datatable的声明。将方法外部的datatable声明为类变量,然后在button Example的方法中初始化实例请解释您的答案仅在方法外部声明datatable。它必须声明为类变量,然后在方法函数中实例化
Products(this is the comboBox) | Quantity |
-------------------------------+----------+
Water                                2        
Juice                                1        
Juice                                2       
Candy                                5 
Cake                                 1
Water                                4  
DataTable dt;
void LoadC()
    {
        using (cnx = new SqlConnection("Var_Connection"))
        {
            cnx.Open();
            var adapt = new SqlDataAdapter("select * from Products", cnx);
            dt = new DataTable();
            adapt.Fill(dt);
            comboBox1.DisplayMember = "ProductName";
            comboBox1.ValueMember = "ProductsID";
            comboBox1.DataSource = dt;
        }
    }