Как я могу вычислить итоговые значения текстовых полей с NumericUpDown? - PullRequest
2 голосов
/ 08 января 2012

Я пытаюсь сделать небольшую форму заказа пиццы, но у меня проблема с расчетами. После выбора пиццы цена за единицу и общие расчеты в порядке, но выбор дополнений создает проблему. После изменения значения NumericUpDown калории неверны (все единицы имеют постоянные цены и калории). Имя NumericUpDown является numberofunit. Как я могу их рассчитать?

if (pepper.Checked)
{
    string peppereklendi = 
        Convert.ToString(Convert.ToDouble(unitprice.Text)+ pepperprice);

    unitprice.Text = peppereklendi;

    total.Text = 
        Convert.ToString(Convert.ToDecimal(unitprice.Text) * numberofunit.Value);

    string pepperkaloriekle = 
        Convert.ToString(Convert.ToInt16(gizlikalori.Text) + pepperkalori);

    gizlikalori.Text = pepperkaloriekle;

    amountofcalorie.Text = 
        Convert.ToString(Convert.ToDecimal(gizlikalori.Text) * numberofunit.Value);
}
else
{
    string peppereklendi = unitprice.Text;

    unitprice.Text = 
        Convert.ToString(Convert.ToDouble(peppereklendi) - pepperprice);

    total.Text = Convert.ToString(Convert.ToDecimal(unitprice.Text) * numberofunit.Value);

    string pepperkaloriekle = gizlikalori.Text;

    gizlikalori.Text = 
        Convert.ToString(Convert.ToDouble(pepperkaloriekle) - pepperkalori);

    amountofcalorie.Text = 
        Convert.ToString(Convert.ToDecimal(gizlikalori.Text) * numberofunit.Value);
}

Этот код является кодом флажка перца.

Это форма моего заявления.

1 Ответ

6 голосов
/ 08 января 2012

Вы должны действительно попытаться отделить логику расчета от логики пользовательского интерфейса (форма).Тогда все станет намного понятнее:

// Get values from the text boxes
decimal up = Convert.ToDecimal(unitprice.Text);
decimal calories = Convert.ToDecimal(gizlikalori.Text);
decimal tot, totCalories;

// Do the calculation
if (pepper.Checked) {
    up = up + pepperprice;
    calories = calories + pepperkalori;
}
tot = up * numberofunit.Value;
totCalories = calories * numberofunit.Value;

// Assign the results to text boxes
unitprice.Text = up.ToString();
total.Text = tot.ToString();
gizlikalori.Text = calories.ToString();
amountofcalorie.Text = totCalories.ToString();

Что вы делаете неправильно, так это то, что вы вычитаете цену перца и калории перца из цены за единицу и калорий единицы, если перец не выбран.Однако цена за единицу (и калории) уже без перца!

Я не вижу, когда вы выполняете этот расчет, однако, если вы будете выполнять его каждый раз, когда увеличиваете количество единиц, вы быдобавляйте цены на перец каждый раз!Вероятно, было бы лучше иметь отдельную переменную для базовой цены за единицу, которая остается неизменной при проверке дополнений.Затем всегда начинайте расчет с базовой цены за единицу.

Кроме того, вы смешиваете много разных типов чисел.Это не имеет смысла.

Следующим шагом для улучшения кода будет создание отдельного класса для вычислений.Вы также можете использовать привязку данных.Это полностью избавит от необходимости делать преобразования.Смотрите мой ответ на следующий пост: манипулирование-textbox-переменные-в-вычислениях

...