根据每个列表项的布尔值添加或减去一个值
本文关键字:一个 添加 列表 布尔值 | 更新日期: 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的变量payed是true。如果我取消选中两个购买者的复选框,变量将为false,label_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);
}