我觉得这里缺少明显的东西。 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);
}


同样,要继续进行操作的一般建议是更改设计。目前,ShoppingBasketForm1高度耦合-这意味着,除了Form1之外,您不能从任何其他来源向购物篮添加新商品!但是ShoppingBasket不应在乎它收到的项目的来源。同样,每当您插入一个项目时,就创建一个新的ShoppingBasket。这意味着每个ShoppingBasket只能有一个项目。因此,为了进一步学习,我建议遵循以下几点:


使ShoppingBasket成为Form1的成员变量。
添加项目时,将项目添加到此成员变量。
不要将表单传递给AddProduct,而是让您的ShoppingBasket提供有关其包含的项目的信息。
listBox1.Items.Add之后立即调用AddProduct


然后,您的ShoppingBasket不在乎产品的展示方式,而仅在乎产品在内部的存储方式。

10-07 16:41