如何使用另一个类中的方法添加到ListBox?

时间:2013-07-18 16:06:49

标签: c# winforms class listbox shopping-cart

我觉得我在这里遗漏了一些明显的东西。 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; }
}

1 个答案:

答案 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);
}

继续提出的一般建议是改变您的设计。目前,ShoppingBasketForm1高度耦合 - 这意味着,您无法从Form1以外的任何其他来源向购物篮添加新商品!但是ShoppingBasket不应该关心它收到的项目的来源。此时,每次插入项目时,您都会创建一个新的ShoppingBasket。这意味着,每ShoppingBasket只能有一个项目。因此,为了进一步学习,我建议遵循以下几点:

  • 使ShoppingBasket成为Form1的成员变量。
  • 添加项目时,将项目添加到此成员变量。
  • 请勿将表单传递给AddProduct,而应让ShoppingBasket提供有关其中包含的项目的信息。
  • listBox1.Items.Add之后立即致电AddProduct

然后您的ShoppingBasket并不关心产品的展示方式,只关心产品的内部存储方式。