根据每个列表项的布尔值添加或减去一个值

本文关键字:一个 添加 列表 布尔值 | 更新日期: 2023-09-27 18:19:59


好吧,我会解释我想做什么。
我有一个买家列表,还有一个列表框。当我将购买者添加到列表框中时,他也会添加到名为购买者的列表中。在这份清单中,我有一个买家名字的值,还有一个bool来说明他是否付款。查看我的列表和它的类:

public class Purchaser
{
     public string Name { get; set; }
     public bool Paid { get; set; }
}
List<Purchaser> Purchasers = new List<Purchaser>();

现在我将解释我的计划:所有购买者必须支付5美元。我有一个名为box_Paid的复选框,当我选中或取消选中它时,列表框中实际选定购买者的变量已支付将变为true或false
我在列表框中对购买者有一个限制:总共14个,一个名为label_AmountLeft的标签中的值为70$
70/14=5美元。每个购买者需要支付5美元。我现在需要的是,当我使用box_Paid.CheckedChanged事件为确定购买者打开变量时,值为70的标签会减少5个单位。例如,当购买者Tom在列表框中被选中时,我选中了我的复选框。Tom的变量已支付的值现在将为true,而标签_AmountLeft的值现在为65。我现在检查一下迪伦,数值是60。如果我取消选中Tom的文本框,值将变为65,因为Dylan的变量payedtrue。如果我取消选中两个购买者的复选框,变量将为falselabel_AmountLeft值将返回到70。
我尝试使用:

double a, b = 5, rest;
private void box_Paid_CheckedChanged(object sender, EventArgs e)
{
    if (box_Paid.Checked == true)
    {
        Purchaser p = Purchasers[listDOF.SelectedIndex];
        p.Paid = true;
        a = System.Convert.ToDouble(label_AmountLeft.Text);
        rest = a - b;
        label_AmountLeft.Text = System.Convert.ToString(rest);
    }
    else
    {
        Purchaser p = Purchasers[listDOF.SelectedIndex];
        p.Paid = false;
        a = System.Convert.ToDouble(label_AmountLeft.Text);
        rest = a + b;
        label_AmountLeft.Text = System.Convert.ToString(rest);
    }
}

但这并不奏效。我觉得这个问题很难理解,但我希望有人能帮助我。提前谢谢!

根据每个列表项的布尔值添加或减去一个值

如果您正确地更新了列表,那么可以简单地使用来计算总和

var sum = Purchasers.Where(p => p.Paid).Count() * 5;

或者,您可以为总和设置一个单独的字段,以避免每次解析文本框值:

// oh, and btw, don't use double when working with money
private decimal _sum;
private void box_Paid_CheckedChanged(object sender, EventArgs e)
{
    if (box_Paid.Checked == true)
    {
        _sum += 5;
    }
    else
    {
        _sum -= 5;
    }
    label_AmountLeft.Text = _sum.ToString();
}

但奇怪的是,您根本没有更新原始列表中的项目,而是每次创建新的Purchaser实例(从事件处理程序返回后立即收集)。

所以,我猜代码应该是这样的:

private void box_Paid_CheckedChanged(object sender, EventArgs e)
{ 
    // get the currently selected item
    var selectedPurchaser = Purchasers[listDOF.SelectedIndex];
    // set its state
    selectedPurchaser.Paid = box_Paid.Checked;
    // calculate the sum and display it
    UpdateSum();
}
private void UpdateSum()
{
    // calculate the paid sum
    var paidSum = Purchasers.Where(x => x.Paid).Count() * 5;
    // get the amount left
    var amountLeft = 70 - paidSum;
    // update the text box (using whatever formatting you prefer)
    label_AmountLeft.Text = string.Format("${0:0.00}", amountLeft);
}