【问题标题】:How to calculate a total from list boxes in a form如何从表单中的列表框计算总数
【发布时间】:2020-04-27 21:40:22
【问题描述】:

如何让我的程序从表单中的 2 个不同列表框中计算总数。我尝试了很多不同的东西,我会得到我不明白它们来自哪里的随机值。这样做的目的是让用户选择他们想要的 cookie 类型和数量。在表格的底部,有一个计算总数的标签。但是当我尝试为此创建代码时,我会得到没有意义的数字,例如 0、2、4 等。

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
        {
            const int ESTIMATED_ARRIVAL = 3;
            label10.Text = monthCalendar1.SelectionStart.AddDays(ESTIMATED_ARRIVAL).ToShortDateString();
        }

        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }

这是我的代码。我在整个互联网上寻找任何类型的远程解决方案,但没有发现任何对我有帮助的东西。我已经为此工作了几个小时。

这就是我的表单的样子。

【问题讨论】:

  • 我在这里看不到任何更新价格标签的代码。也没有填充列表框的任何代码。
  • 1.获取他们选择的项目的选定索引。 2. 在代码中查找选定索引的值(对于“类型”列表框,索引 0 = 1.5,索引 1 = 1,索引 2 = 1.25。如何查找取决于数据源,或者如果您想要硬编码映射,或者如果您想从文本中解析数字)3. 将值相乘。

标签: c#


【解决方案1】:

没有看到您的代码,很难具体回答,但这是一种方法。

首先,我们意识到我们需要为列表框中的每个项目捆绑“描述”以及“数量”或“价格”。一种简单的方法是创建一个基本类:

public class MyItem
{
    public string Description { get; set; }
    public decimal Value { get; set; }

    public MyItem(string description, decimal value)
    {
        Description = description;
        Value = value;
    }
}

现在我们可以创建此类的列表并将这些列表用作列表框的数据源,这样列表框中的每个Item 都实际上是MyItem 类的一个实例:

private void Form1_Load(object sender, EventArgs e)
{
    // Set the DataSource for each listbox to 
    // a list of our custom "MyItem" class
    lstCookieTypes.DataSource = new List<MyItem>
    {
        new MyItem("$1.50 - Chocolate Chip Cookie", 1.5m),
        new MyItem("$1.00 - Oatmeal Cookie", 1),
        new MyItem("$1.25 - Sugar Cookie", 1.25m),
    };

    lstCookieQuantities.DataSource = new List<MyItem>
    {
        new MyItem("1 Cookie", 1),
        new MyItem("1 Dozen Cookies", 12),
        new MyItem("2 Dozen Cookies", 24),
    };

    // Continued below...

现在我们的列表框已经填充了数据,我们需要指定DisplayMember,或者我们希望它用于向用户显示文本的属性。这将是我们的“描述”属性:

    // Use the "Description" property of "MyItem" as the DisplayMember
    lstCookieTypes.DisplayMember = "Description";
    lstCookieQuantities.DisplayMember = "Description";
}

接下来我们需要一个方法,该方法可以从每个列表框中获取所选项目,确定这些项目的值,将它们相乘,然后将结果(以货币形式)显示给用户。请注意,我们必须将SelectedValue 转换为MyItem 才能访问Value 属性(并且有一些空值合并来处理SelectedValuenull 的情况):

private void DisplayTotal()
{
    // Calculate the total by multiplying the "Value" for the selected 
    // cookie type with the "Value" for the selected cookie quantity
    var total = ((lstCookieTypes.SelectedValue as MyItem)?.Value ?? 0)  *
                ((lstCookieQuantities.SelectedValue as MyItem)?.Value ?? 0);

    lblPrice.Text = total.ToString("C");  // "C" will format the number as currency
}

最后,剩下的就是从每个列表框的SelectedIndexChanged 事件中调用这个方法,这样当用户选择一个新的 cookie 或一个新的数量时,我们的总数就会更新:

private void lstCookieTypes_SelectedIndexChanged(object sender, EventArgs e)
{
    DisplayTotal();
}

private void lstCookieQuantities_SelectedIndexChanged(object sender, EventArgs e)
{
    DisplayTotal();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2011-08-19
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多