Хорошо, я объясню, что я пытаюсь сделать.
У меня есть список для моих покупателей, а также список. Когда я добавляю покупателя в список, он также добавляется в список "Покупатели". В этом списке у меня есть значение для имени покупателя и 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. Переменное заплатил значение Тома теперь будет верно и значение label_AmountLeft теперь будет 65. Я проверяю теперь Дилан, значение идет до 60. Если я снимите текстовое поле для Тома, значение идет на 65, потому что переменный Дилан заплатил это правда. Если я сниму флажок для обоих покупателей, переменные будут ложными, а значение 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);
}
p
.ListBox.SelectedItem
вы не должны использоватьListBox.SelectedItem
или что-то? Можете ли вы разместить код, где вы инициализируете список?else
вы не устанавливаетеp.Paid
равным false. Математическая часть выглядит правильно (если немного странно, вы не должны хранить состояние в элементах управления). Что именно не так?