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

本文关键字:方法 添加 ListBox 何使用 另一个 | 更新日期: 2023-09-27 18:23:44

我觉得这里缺少了一些明显的东西。这是我的表格截图。

我有两个类,ShoppingBasket和OrderItem,然后是Form1类。我在OrderItem中有四个属性,我想在ShoppingBasket中使用它们。我想在文本框1中输入产品名称,在numericupdown1中输入数量,在文本框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)));
    }
}

订单项目:

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; }
}

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

您的问题是,无论何时添加产品,都要从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提供有关它所包含项目的信息
  • AddProduct之后立即呼叫listBox1.Items.Add

那么你的ShoppingBasket并不关心你的产品是如何展示的,它只关心产品是如何在内部存储的。