Неправильный ответ, когда int32 ведет себя странно, как мне это решить? C # - PullRequest
1 голос
/ 18 октября 2019

Я пытаюсь получить результат с помощью этого кода. Предполагается работать с любым числом / цифрами, которые я выберу, но в конце он работает только с «0». (val1, это текстовое поле, в котором я пишу число / цифры) и (yarncombobox, ft3.garnlangd1 - это то место, где я получаю значение, необходимое для расчета). Я предполагаю, что Int32 может быть неправильным ... что я должен использовать вместо этого?

Кроме того, при удалении всех чисел я получаю сообщение об ошибке "System.FormatException: 'Indatasträngen hade ett felaktigt format.'"

private void YarnWeightTextbox_TextChanged(object sender, EventArgs e)

            Int32 val1 = Convert.ToInt32(YarnWeightTextbox.Text);
        Class2 ft3 = YarnComboBox.SelectedItem as Class2;
        {
            YarnLengthTextbox.Text = Convert.ToString((val1 / 50) * ft3.garnlangd1);

Редактировать: я получил несколько работать, это дает правильное значение с плавающей точкой. Но проблема та же. При удалении всех номеров в одном поле приложение вылетает.

            float val1 = Convert.ToSingle(YarnWeightTextbox.Text);
        Class2 ft3 = YarnComboBox.SelectedItem as Class2;
        float val2 = val1 / 50 * ft3.garnlangd1;
        {
            YarnLengthTextbox.Text = Convert.ToString(val2);

Ответы [ 3 ]

0 голосов
/ 18 октября 2019
private void YarnWeightTextbox_TextChanged(object sender, EventArgs e)
{
    if (sender is TextBox textBox)
    {
        if (float.TryParse(textBox.Text, out var yarnWeight) && YarnComboBox.SelectedItem is Class2 class2)
        {
            var yarnLength = (yarnWeight / 50.0) * class2.garnlangd1;

            YarnLengthTextbox.Text = yarnLength.ToString();
        }
        else
        {
            YarnLengthTextbox.Text = string.Empty;
        }
    }
}
0 голосов
/ 18 октября 2019

Как отметил Шейн Хоу в комментариях, вы получаете FormatException, потому что событие TextChanged запускает каждый раз, когда изменяется текст .

Если значение в YarnWeightTextBox.Text равно "5", и вы удаляете "5", после чего запускается событие TextChanged. Это означает, что вы передаете пустую строку "" в Convert.ToSingle. Пустая строка не преобразуется в float, поэтому вы получите FormatException. То же самое вы получите, если в эту TextBox также добавите что-либо, кроме цифры.

Лучшим вариантом будет проверить, соответствует ли значение в YarnWeightTextBox.Text значению float вместоиспользуя Convert.ToFloat.

private void YarnWeightTextBox_TextChanged(object sender, EventArgs e)
{
   float val1 = 0.0F;
   if (!float.TryParse(YarnWeightTextBox.Text, out val1))
   {
      // The value in YarnWeightTextBox.Text does not parse to a float. You could 
      // do something here to indicate to the user that they did not provide a correct
      // value, or just return.
      return;
   }
   // Calculate the yarn length and put it in the YarnLengthTextBox.Text like you're doing now.
}

В качестве альтернативы, если это Windows Forms, вы можете взглянуть на элемент управления NumericUpDown, который не позволит пользователям вводить недопустимые значения.

0 голосов
/ 18 октября 2019

Вот несколько предложений:

private void YarnWeightTextbox_TextChanged(object sender, EventArgs e)
{
        //Check for the empty string. If it is empty then just return
        string weight = YarnWeightTextbox.Text;
        if(String.IsNullOrEmpty(weight))
        {
            return;
        }

        //Otherwise convert to integer or to a float as you have
        Int32 val1 = Convert.ToInt32(YarnWeightTextbox.Text);

        Class2 ft3 = YarnComboBox.SelectedItem as Class2;
        //When casting using the `as` operator. I make a point of checking for null just
        //in case for some reason it isn't an instance of the class I expect.
        if(ft3 != null)
        {
            //Finally change the 50 to 50.0. This tells the compiler to divide using a float
            //rather than an integer. Dividing 2 integers results in the truncation of the fractional part
            YarnLengthTextbox.Text = Convert.ToString((val1 / 50.0) * ft3.garnlangd1);
        }
}

Наиболее важными частями являются:

  1. Проверка на пустую строку
  2. Деление с использованием деления на число вместоЦелочисленное деление как целочисленное деление удалит дробную часть результата, что может объяснить некоторые странные результаты, которые вы видите.
...