我觉得这里缺少明显的东西。 This is a screenshot of my form.
我有两个类,ShoppingBasket和OrderItem,然后是Form1类。我要在ShoppingBasket中使用的OrderItem中有四个属性。我想在文本框1中使用产品名称,在数字updown 1中使用数量,在文本框2中使用最新价格,然后单击添加按钮,它将使用OrderItem类验证值,然后将其放入ShoppingBasket类的AddProduct方法中。希望它将在表单的列表框中添加一行。
表格1:
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);
}
}
购物篮:
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; }
}
最佳答案
您的问题是,每当添加产品时,您都在通过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()
),列表项get也会添加到此“不可见”表单中,而不是原始表单。为了解决此问题,我建议将表单作为参数传递给
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
不在乎产品的展示方式,而仅在乎产品在内部的存储方式。