首页 > 解决方案 > ComboBox 设置一个值 C#

问题描述

我今天有一个艰难的。我正在使用 C# 在 Windows 窗体中创建一个应用程序,我应该制作一个应用程序来显示每个订单的状态、日期和全价。这一切都得到了照顾。第二种形式是订单详细信息,我应该在组合框中包含 OrderID、ProductName、UnitPrice 和 Quantity 列。我已经设法创建了所有这些,使用 Dapper 通过 SQL 设置它们的值,但是我很难让组合框显示 ProductID 的值。

为简化起见:我希望组合框显示产品名称,其 ProductID 与订单详细信息中给出的名称相匹配。如果我更改组合框内的产品,我需要它获取组合框 ProductID 值并在订单详细信息中更改它。如果订单是没有详细信息的新订单,则应将其默认设置为 ProductID 为 1。

组合框位于使用 Dapper 创建的订单详细信息列表的 DataGridView 内。其他一切都像魅力一样,我只是在组合框上遇到了很多麻烦。

这是一些代码,如果需要我会添加更多:

这是组合框本身的代码

private void fillcombobox()
        {
            DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
            combo.HeaderText = "ProductName";
            DataAccess dt = new DataAccess();
            products = dt.GetAllProducts();
            combo.DataSource = products;
            combo.DisplayMember = "ProductName";
            combo.ValueMember = "ProductID";
            orderdetailsGridView.Columns.Add(combo);
            combo.DisplayIndex = 0;
        }

这是 OrderDetails 类

public class OrderDetails
    {
        public int OrderID { get; set; }
        public int ProductID { get; set; }
        public decimal UnitPrice { get; set; }
        public int Quantity { get; set; }
    }

这是产品类

public class Product
    {
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public decimal UnitPrice { get; set; }
        public int UnitsInStock { get; set; }
    }

这是 GetAllProducts 的查询

public List<Product> GetAllProducts()
        {
            using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("ShopDB")))
            {
                var output = connection.Query<Product>("select * from Products").ToList();
                return output;
            }
        }

在此处输入图像描述

标签: c#combobox

解决方案


由于您只是从 .Query 类中做产品,只需更新您的类结构以具有只读属性(只有一个 getter),该属性仅在您的组合框中返回格式化值以用于演示目的。

public class Product
    {
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public decimal UnitPrice { get; set; }
        public int UnitsInStock { get; set; }
        public string ShowProductAndId 
           { get { return ProductName + " (" + ProductID + ")"; } }

    }

然后,将您的显示值设置为新属性“ShowProductAndId”。

请澄清

看来我们沟通不好。您正在询问产品 ID,这是值成员将拥有的(产品 ID),但显示成员显示实际产品名称。如果这是给定订单的详细信息屏幕,并且您正在列出某人订购的商品,我希望您的查询会根据正在查看的单个订单编号有所不同。我会从订单详细信息和产品 ID 中获取详细行项目作为参考及其产品名称。使用包含实际订购的所有部件的 OrderDetail 类。这样的查询可能是

select
      OD.*,
      P.ProductName
   from
      OrderDetail OD
         JOIN Product P
            on OD.ProductID = P.ProductID
   where
      OD.OrderID = @selectedOrderToGetDetailsFor

然后,我会让您的 ShowOrderDetail 从您的 OrderDetail 派生,这样您就可以将现在预期的产品名称作为其结果的一部分,如下所示将获得您的 NORMAL OrderDetail 的所有属性,但同时也包括产品名称时间作为上述查询的结果集。

public class ShowOrderDetail : OrderDetail
{
   public string ProductName { get; set; }
}

然后,您可以让 Order Details 组合引用此类中的 ProductName,而不是 ALL PRODUCTS。

不一定是一个伟大的设计计划。不知道为什么您可能有 5 个小部件的订单,产品 ID = 3,然后让用户看到该行并让他们将其更改为 5 个其他东西,产品 ID = 17。没有意义。但是您可以只使用行中显示的产品名称,因为您现在可以将其作为结果集使用,并且用户将无法更改订购的商品。

最后的评论(希望?)

所以,现在我看到了你的形象。你基本上需要两个绑定。一个用于显示记录源,但 SELECTED VALUE (ID) 需要绑定到数据中记录的 ID 键。自从我做 C# Windows 窗体以来已经有一段时间了,在我进入 C#/WPF 之前并没有做那么多,所以我的绑定没有那么强。我可以尝试玩一些,但今天不能。

但是,请看这里。这个另一个答案显示了代码中的 WinForms 绑定,类似于您为准备组合框所做的事情。但是您可能希望将附加绑定添加到您选择的详细记录所在的源和用于刷新的 ITS 产品 ID。

因此,组合框的绑定将有两个来源。您已经拥有该列表的第一个,但第二个用于将所选值绑定绑定到订单上所有项目的数据网格的详细信息列表,以及该订单详细信息记录上 ProductID 的 PATH。

看看他们如何创建“BindingSource”,并将其设置到列表中。在您的情况下,您希望指向您的订单详细信息列表。但是,您想要的数据成员/路径是“ProductID”,因为它在详细记录中。

希望我可以为您提供更多帮助,但这应该有助于将您推向您需要的东西。


推荐阅读