为列表框中的每个项目添加价格 - C# .Net,Windows Forms Applications

Adding a price to each item in a listbox - C# .Net, Windows Forms Applications

我正在尝试使用 C# 构建 windows 表单应用程序。 该应用程序的主要功能是允许用户将商品添加到购物车(可能是一个列表框)并汇总(到标签文本)添加到该购物车的产品的总价。此外,可以多次添加产品。所以基本上它可以称为购物车应用程序。

我的问题是,如何计算添加到购物车的商品的总价? 因为,首先,我已经将所有产品作为字符串列表添加到此列表框中(使用 Listbox.Items.Add("Product1")。所以我不知道如何为每个产品添加价格(此列表的字符串元素),以后可以把它加起来。

我是否应该以某种方式将产品添加为 Product Class 类型的对象(具有 2 个属性,名称和价格)?如果是这样,我如何将名称 属性 传递给列表框项目列表?

到目前为止,这是我的一些主要代码:

public Form1()
{
    InitializeComponent();
    Product products = new Product();
    AddProducts(); 
}

List<string> productList = new List<string>();

public void AddProducts()
{
    productNames.Add("Product X");
    productNames.Add("Product Z");

    foreach (var product in productList) 
    {
        ProductListBox.Items.Add(product);
    }
}

要做的第一件事是使用两个单独的属性定义产品 class,一个用于 Name,一个用于 Price.
然后在单个字符串中将 ToString() 方法覆盖为 return,将名称和价格都转换为字符串或仅转换为名称。

如果您想要在列表框中显示的单行中显示产品名称及其价格,则需要此覆盖。事实上,当通过数据源绑定时,ListBox 控件会查看绑定的 ToString 方法 class 来表示其项目。

public class Product
{ 
    public string Name { get; set; }
    public decimal Price { get; set; }

    // This returns both Name and Price, but, of course, if you want only
    // the name just return $"{Name}"
    public override string ToString()
    {
        return $"{Name} - {Price.ToString("C")}";
    }
}

现在,在您的表单构造函数中,您可以创建产品列表(在此示例中是静态的)并将该列表传递给 ListBox 的数据源 属性。
最后,计算总数的任务只是对 Sum 扩展的简单 Linq 调用,并将结果传递给标签文本 属性.

List<Product> products = new List<Product>();
public Form1()
{
    InitializeComponent();
    AddProducts(); 
    ProductListBox.DataSource = products;
    labelTotalPrice.Text = products.Sum(x => x.Price).ToString("C");
}

public void AddProducts()
{
    products.Add(new Product {Name = "Product X", Price = 10.4m});
    products.Add(new Product {Name = "Product Z", Price = 1.5m});
    products.Add(new Product {Name = "Product K", Price = 7.32m});
}