c # - добавление или вычитание значения в соответствии с логическим значением для каждого элемента списка

1


Хорошо, я объясню, что я пытаюсь сделать.
У меня есть список для моих покупателей, а также список. Когда я добавляю покупателя в список, он также добавляется в список "Покупатели". В этом списке у меня есть значение для имени покупателя и 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);
    }
}

Но это не сработало. Я думаю, что этот вопрос трудно понять, но я надеюсь, что кто-то сможет мне помочь. Заранее спасибо!

  • 0
    Я не вижу нигде используемой переменной p . ListBox.SelectedItem вы не должны использовать ListBox.SelectedItem или что-то? Можете ли вы разместить код, где вы инициализируете список?
  • 0
    В блоке else вы не устанавливаете p.Paid равным false. Математическая часть выглядит правильно (если немного странно, вы не должны хранить состояние в элементах управления). Что именно не так?
Показать ещё 3 комментария
Теги:
winforms

1 ответ

4
Лучший ответ

Если вы правильно обновляете свой список, тогда сумму можно просто вычислить, используя:

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);
}
  • 0
    У меня возникла ошибка в Buyrs.Where ( p => "Локальная переменная с именем 'p' не может быть объявлена в этой области, потому что она даст другое значение для 'p', который уже используется в 'parent или текущая «область для обозначения чего-то другого».
  • 0
    Спасибо, Groo, но теперь у меня есть ошибка "Не удалось неявно преобразовать тип 'int' в 'string' в Purchasers.Where (x => x.Paid) .Count () * 5;
Показать ещё 17 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню