我觉得我在这里遗漏了一些明显的东西。 This is a screenshot of my form.
我有两个类,ShoppingBasket和OrderItem,然后是Form1类。我在OrderItem中有四个属性,我想在ShoppingBasket中使用它。我想获取textbox1中的产品名称,numericupdown1中的数量以及textbox2中的最新价格,然后我将单击使用OrderItem类验证值的添加按钮,然后将它们放入ShoppingBasket类的AddProduct方法中希望在表格中的列表框中添加一行。
Form1中:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void addButton_Click(object sender, EventArgs e)
{
decimal latestPrice;
ShoppingBasket addButtonShoppingBasket = new ShoppingBasket();
decimal.TryParse(textBox2.Text, out latestPrice);
OrderItem currentItemQuantity1 = new OrderItem(textBox1.Text, latestPrice, Convert.ToInt32(numericUpDown1.Value));
addButtonShoppingBasket.AddProduct(currentItemQuantity1.ProductName, currentItemQuantity1.LatestPrice, currentItemQuantity1.Quantity);
}
}
ShoppingBasket:
public class ShoppingBasket
{
public ShoppingBasket()
{
}
public void AddProduct(string productName, decimal latestProductValue, int quantity)
{
Form1 newform = new Form1();
string itemFormatString = "{0,-50}{1,0}{2,50}";
newform.listBox1.Items.Add(string.Format(itemFormatString, productName, Convert.ToString(quantity), Convert.ToString(latestProductValue)));
}
}
OrderItem的:
public class OrderItem
{
public OrderItem(string productName, decimal latestPrice, int quantity)
{
ProductName = productName;
LatestPrice = latestPrice;
Quantity = quantity;
TotalOrder = latestPrice * quantity;
}
public string ProductName { get; set; }
public decimal LatestPrice { get; set; }
public int Quantity { get; set; }
public decimal TotalOrder { get; set; }
}
答案 0 :(得分:1)
您的问题是,无论何时添加产品,您都会从ShoppingBasked
创建新表单:
public void AddProduct(string productName, decimal latestProductValue, int quantity)
{
Form1 newform = new Form1();
string itemFormatString = "{0,-50}{1,0}{2,50}";
newform.listBox1.Items.Add(string.Format(itemFormatString, productName, Convert.ToString(quantity), Convert.ToString(latestProductValue)));
}
newform
不是实际调用AddProduct
的形式!即使您没有在任何地方看到此newform
(因为未调用newform.Show()
),列表项也会被添加到此“隐形”表单中,而不是原始表单。
要解决此问题,我建议您将表单作为参数传递给AddProduct
:
public void AddProduct(Form1 form, string productName, decimal latestProductValue, int quantity)
{
string itemFormatString = "{0,-50}{1,0}{2,50}";
form.listBox1.Items.Add(string.Format(itemFormatString, productName, Convert.ToString(quantity), Convert.ToString(latestProductValue)));
}
并称之为:
private void addButton_Click(object sender, EventArgs e)
{
// ...
// Your current code here
// ...
addButtonShoppingBasket.AddProduct(this,
currentItemQuantity1.ProductName,
currentItemQuantity1.LatestPrice,
currentItemQuantity1.Quantity);
}
继续提出的一般建议是改变您的设计。目前,ShoppingBasket
与Form1
高度耦合 - 这意味着,您无法从Form1
以外的任何其他来源向购物篮添加新商品!但是ShoppingBasket
不应该关心它收到的项目的来源。此时,每次插入项目时,您都会创建一个新的ShoppingBasket
。这意味着,每ShoppingBasket
只能有一个项目。因此,为了进一步学习,我建议遵循以下几点:
ShoppingBasket
成为Form1
的成员变量。AddProduct
,而应让ShoppingBasket
提供有关其中包含的项目的信息。listBox1.Items.Add
之后立即致电AddProduct
。然后您的ShoppingBasket
并不关心产品的展示方式,只关心产品的内部存储方式。