#c# #winforms
#c# #winforms
Вопрос:
Здравствуйте, я очень новичок на этом сайте и в C #. Я пытаюсь создать приложение Winforms на VS 2017, которое содержит NumericUpDown и 2 текстовых поля. Мне нужно разделить значение из текстового поля 1 на значение в элементе управления NumericUpDown, а затем суммировать и показать результат внутри текстового поля 2, но в форме double. Проблема, с которой я сталкиваюсь, заключается в том, что ничего не вычисляется, пока я не изменю значение numericupdown 3 раза, и тогда итоговый результат неверен. Оно отключено на 1 изменение значения. Итак, если я нажму на nud 3 раза, а значение в текстовом поле 1 равно 0,28, это должно дать мне результат 0,09333333, который равен 0,28, разделенный на 3, но вместо этого он дает мне 0,14. Если я нажимаю на nud, похоже, что оно делится на ноль. Может ли тот факт, что numericupdown начинается со значения 0, иметь какое-либо отношение к моей проблеме? Я не получаю никаких сообщений об ошибках или исключений при запуске приложения. Я был бы признателен за любую помощь. Пожалуйста, не будьте слишком строги ко мне, я супер новичок в c #, спасибо
Вот код
private void numericUpDown1R2Scrap_ValueChanged(object sender, EventArgs e)
{
double val1 = 0.0;
double val2 = 0.0;
double total = 0.0;
if (!string.IsNullOrEmpty(textBox1WeightSummary.Text) amp;amp;
!string.IsNullOrEmpty(numericUpDown1R2Scrap.Text))
{
val1 = double.Parse(numericUpDown1R2Scrap.Text);
val2 = double.Parse(textBox1WeightSummary.Text);
if (val1 != 0)
{
total = val2 / val1;
textBox1RingWeightTotal.Text = total.ToString();
}
Комментарии:
1. Это обычная проблема при отладке. Вероятно, что -то происходит первые 2 раза, просто результат слишком мал. Узнайте, как отлаживать свой код, поскольку это не последний код с ошибками, который вы напишете. Навигация по коду с помощью пошагового отладчика . Это также поможет вам написать лучший код, потому что вы лучше поймете, как работает код.
Ответ №1:
ValueChanged
возникает перед обновлением Text
свойства: поэтому содержимое numericUpDown1R2Scrap.Text
будет устаревшим при обработке ValueChanged
. Вместо этого используйте Value
свойство, которое будет иметь актуальное значение. Это уже числовой тип, поэтому вам также не нужно его анализировать (но вам нужно его преобразовать, так как это происходит decimal
во время использования double
):
val1 = (double)numericUpDown1R2Scrap.Value;
val2 = double.Parse(textBox1WeightSummary.Text);
Комментарии:
1. Джефф Э. Ваше решение сработало как нельзя лучше. Большое вам спасибо!! Кто бы мог подумать, что это такое простое исправление. Мне потребовалось несколько дней, чтобы попытаться разобраться в этом самостоятельно, но безрезультатно.
Ответ №2:
В конструкторе форм установите для свойств NumericUpDown Minimum
и Value
значение 1. Это позволяет начинать с 1 и не позволит перейти к 0
.
Затем всегда проверяйте, NumericUpDown.Value
чтобы прочитать текущее значение, которое является decimal
типом.
Используйте десятичное число.Попробуйте выполнить синтаксический анализ, чтобы преобразовать числовой ввод текстового поля. Обратите внимание, что реализация по умолчанию предполагает, что вы используете текущий разделитель десятичных символов. Смотрите Документы об использовании InvariantCulture
ссылки для принудительного использования точки в качестве десятичного разделителя и запятой в качестве разделителя тысяч, если это необходимо.
private void numericUpDown1R2Scrap_ValueChanged(object sender, EventArgs e)
{
NumericUpDown nUpDown = sender as NumericUpDown;
if (nUpDown.Value == 0) nUpDown.Value = 1;
if (decimal.TryParse(textBox1WeightSummary.Text, out decimal inputValue)) {
textBox1RingWeightTotal.Text = (inputValue / nUpDown.Value).ToString();
}
}
Эта строка: if (nUpDown.Value == 0) nUpDown.Value = 1;
является отказоустойчивой, на случай, если кто-то забыл установить NumericUpDown Value
и Minimum
на 1
в конструкторе (или в конструкторе формы).
Эта строка: NumericUpDown nUpDown = sender as NumericUpDown;
, используется для извлечения экземпляра элемента управления NumericUpDown, который вызвал событие. Это позволяет повторно использовать код для любого другого элемента управления NumericUpDown без изменения ссылки вручную.
Этот синтаксис: decimal.TryParse([Some string], out decimal inputValue)
требуется C# 7.0
.
Если вы используете предыдущую версию языка, вам необходимо объявить локальную переменную вне метода:
decimal inputValue = 0m;
if (decimal.TryParse(textBox1WeightSummary.Text, out inputValue)) { ... }
В этой строке: (inputValue / nUpDown.Value).ToString();
вы могли бы изменить формат toString(), указав количество десятичных знаков для использования. Например:
(inputValue / nUpDown.Value).ToString("N2");
выведет десятичное число, отформатированное для отображения только с первыми 2 десятичными позициями.