【问题标题】:ComboBox setting a value C#ComboBox 设置一个值 C#
【发布时间】:2020-11-04 11:03:59
【问题描述】:

我今天有一个艰难的。我正在使用 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;
            }
        }

【问题讨论】:

  • 您能否显示您对 dt.GetAllProducts() 的查询。作为具有特定订单 ID 的子表单,我假设其中有一个 where 子句仅用于查看一个订单。请编辑您现有的帖子并添加查询。
  • @DRapp 来了!谢谢你看我的问题! :D

标签: c# combobox


【解决方案1】:

为组合设置数据源后,您可以将自己附加到 orderdetailsGridView 的行添加事件。在事件监听器中,您可以设置组合列的值。

附加到事件

orderdetailsGridView.RowsAdded += DataGridView_RowsAdded;

事件监听器然后可以像这样:

     private void DataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
    {
        ((DataGridViewComboBoxCell)((DataGridView)sender).Rows[e.RowIndex].Cells["ProductName"]).Value =
            ((List<OrderDetails>)dataGridView1.DataSource)[e.RowIndex].ProductID;

    }

【讨论】:

    【解决方案2】:

    由于您只是从 .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 之前并没有做那么多,所以我的绑定没有那么强。我可以尝试一下,但今天不行。

    However, take a look here。 This other answer显示代码中的 WinForms 绑定,类似于您为准备组合框所做的工作。但您可能希望将附加绑定添加到您选择的详细记录所在的源和用于刷新的 ITS 产品 ID。

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

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

    希望我可以为您提供更多帮助,但这应该有助于推动您实现所需。

    【讨论】:

    • 很抱歉,我没有正确解释我的问题。我对只显示 ProductName 的组合框很好,我需要它显示与 OrderDetails 列表中的 ProductID 对应的 ProductName,因为在我的数据库中,ProductID 是 OrderDetails 中的外键。当然,更改组合框中的选定项目也会更改 OrderDetails 列表中的 ProductID。
    • 或者更简单地说:我需要组合框在 OrderDetails 列表中充当 ProductID,但它必须显示 ProductName,而不是显示 ID。
    • @aiimshock,请参阅修订说明内容。
    • 真的很抱歉没有把问题解释的准确到需要的程度,我还比初级低,所以我还有很多东西要学,尤其是我必须向别人解释的部分我其实需要做的。我想我理解了到目前为止你给我的一切,但是如果我将我的 ProductName 包含在其中,那只会将它“绑定”到那个 ProductName,对吗?我正在尝试准确地创建您告诉我的内容,但我还需要在组合框中填充所有产品,这样我就可以在 datagridview 的哪个 OrderDetail 行中选择哪个产品。
    • 我现在正在用表格发布一张图片,也许这可以更好地解释这个请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    相关资源
    最近更新 更多