[英]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.