[英]ComboBox setting a value 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;
}
}
为组合设置数据源后,您可以将自己附加到 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;
}
由于您只是从您的 .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 somethingElse,产品 ID = 17。没有意义。 但是您可以只拥有显示在行上的产品名称,因为您现在可以将其作为结果集使用,而用户将无法更改订购的项目。
最后评论(希望?)
所以,现在我看到了你的形象。 您基本上需要两个绑定。 一个用于显示记录的来源,但需要将 SELECTED VALUE (ID) 绑定到数据中记录的 ID 键。 自从我使用 C# Windows Forms 已经有一段时间了,在我进入 C#/WPF 之前并没有做那么多,所以我的绑定没有那么强。 我可以尝试使用它一些,但今天不能。
但是,看看这里。 这个另一个答案在代码中显示了 WinForms 绑定,类似于您准备组合框的操作。 但您可能希望向所选详细记录所在的源和 ITS 产品 ID 添加附加绑定以进行刷新。
因此,组合框的绑定将有两个来源。 您已经拥有列表的主要内容,但第二个用于将所选值绑定绑定到订单上所有项目的数据网格的详细信息列表,以及该订单详细信息记录上 ProductID 的 PATH。
看看他们如何创建“BindingSource”,并将其设置到列表中。 在您的情况下,您希望指向您的订单详细信息列表。 但是,您想要的数据成员/路径是详细记录中的“ProductID”。
希望我能帮助你更多,但这应该有助于推动你达到你所需要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.