【问题标题】:How to bind combox with 2 different tables in c# windows form如何在 c# windows 窗体中将组合框与 2 个不同的表绑定
【发布时间】:2021-05-10 13:17:56
【问题描述】:

所以基本上我想在我使用 2 个表的组合框中输入客户名称。 下面的表名是 SaleOrders,我从这个表中获取 CustomerId

我代表那些 CustomerId 从名为“客户”的下表中获取客户名称。

所以,我的目标是根据从组合框中选择的客户名称从 SaleOrders 中获取 SaleOrderId。

这是我获取客户名称并将其加载到名为 customerid_cb 的组合框中的方法。

private void GetCustomerId()
    {
        con.Open();
        cmd = new SqlCommand("select Name from Customers  inner join SaleOrders 
                              SaleOrders.CustomerId=Customers.CustomerId where Status=3", con);
        read = cmd.ExecuteReader();
        while (read.Read())
        {
            customerid_cb.Items.Add(read.GetValue(0).ToString());
        }
    }

这是我获取 SaleOrderId 并将其加载到名为 saleorderid_cb 的组合框中的方法。

 private void GetSaleOrderId()
    {
        con.Open();
        cmd = new SqlCommand("select SaleOrderId from SaleOrders s , Customers c where Status=3 and  
                c.CustomerId='" + customerid_cb.Text + "'" + " and c.CustomerId=s.CustomerId", con);
        read = cmd.ExecuteReader();
        while (read.Read())
        {
            saleorderid_cb.Items.Add(read.GetValue(0).ToString());
        }
        con.Close();
       }

问题:

所以,我面临的问题是 CustomerId 71 和 75 具有相同的名称,所以当我从组合框 (customerid_cb) 中选择第一个“df”时,它会在 saleorderid_cb 上显示 67 和 68 SaleOrderId,我只想将 67 SaleOrderId 显示为CustomerId 75 只有 67 个 SaleOrderId,与 71 CustomerId 相同。 我意识到的解决方案是将customeid_cb 与2 个表SaleOrders 和Customers 绑定,但我没有得到任何解决方案来做到这一点。

我希望我的问题对你来说很清楚。如果有人知道如何解决这个问题,请帮忙。

【问题讨论】:

    标签: c# sql combobox


    【解决方案1】:

    我们拥有唯一 ID 的全部原因是允许名称等内容相同,并且仍然能够区分人们

    如果我们选择名称​​和 ID,那么我们可以继续区分人们:

    private void FillCustomers() //name methods appropriately; this method is void - it didn't "Get" anything
    {
        
        using(da = new SqlDataAdapter("select DISTINCT c.Name, c.Id 
          from Customers c 
          inner join SaleOrders s ON s.CustomerId = c.CustomerId 
          where s.Status=3", con);
        {
            var dt = new DataTable();
            da.Fill(dt);
            customerid_cb.DisplayMember = "Name";
            customerid_cb.ValueMember = "Id";
            customerid_cb.DataSource = dt;
        }
    }
    

    然后,当我们想查找某些内容时,我们可以通过他们的 Id 来完成:

    private void FillSaleOrders() 
    {
        using(da = new SqlDataAdapter("select SaleOrderId from SaleOrders
           where Status = 3 AND CustomerId=@custId", con); //NEVER ever concatenate values into an SQL string - number one way of getting hacked. See http://bobby-tables.com
        {
            da.SelectCommand.Parameters.Add("@custid", SqlDbType.Int).Value = customerid_cb.SelectedValue; //use the ID of the customer for the search param not their name
            var dt = new DataTable();
            da.Fill(dt);
            saleorderid_cb.DisplayMember = "SaleOrderId"; //you'd be better off showing something else
            saleorderid_cb.ValueMember = "SaleOrderId";
            saleorderid_cb.DataSource = dt;
        }
    }
    

    【讨论】:

    • 非常感谢先生!!有用。并感谢您提供建议!上帝保佑你。
    猜你喜欢
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多