Непустое значение Textbox.text читается как пустое. Преобразование из строки "" в тип "Double" недопустимо - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь создать приложение vb. net, в котором у меня есть несколько текстовых полей в основной форме, и они заполняются числовыми значениями во время разработки.
На изображении ниже показан фрагмент моей формы. :

enter image description here

Но когда я создаю приложение, заполненные числовые значения читаются как пустые строки ("").
Вот точное ошибка:

An exception of type 'System.InvalidCastException' occurred in Microsoft.VisualBasic.dll but was not handled in user code

Additional information: Conversion from string "" to type 'Double' is not valid.

Вот фрагмент окна autos:
enter image description here

Обратите внимание в окне Autos на значение свойства text TextBoxWireDiameter это "". Но я добавил ценность к свойству text во время разработки. Та же ошибка возникает и для других текстовых полей, которые я заполнил. Любая идея, почему это происходит?

Вот мой код: (Все подпрограммы содержат одинаковый код)

Public Class Form1
Private Sub TextBoxWireLength_TextChanged(sender As Object, e As EventArgs) Handles TextBoxWireLength.TextChanged
    Dim WireArea As Double = Math.PI * (TextBoxWireDiameter.Text / 1000) * (TextBoxWireDiameter.Text / 1000) / 4
    Dim WireMass As Double = 8400 * WireArea * (TextBoxWireLength.Text / 1000)
    TextBoxWireResistance.Text = ((TextBoxWireResistivity.Text * (TextBoxWireLength.Text / 1000)) / WireArea)
    TextBoxWireCurrent.Text = TextBoxWireVoltage.Text / TextBoxWireResistance.Text
    TextBoxWirePower.Text = TextBoxWireVoltage.Text * TextBoxWireCurrent.Text
    TextBoxWireHeat.Text = TextBoxWirePower.Text * TextBoxWireCurrentDuration.Text * 60
    TextBoxWireTemperatureRise.Text = TextBoxWireHeat.Text / (WireMass * 450)
    TextBoxWireTemperature.Text = TextBoxWireTemperatureRise.Text + 22
End Sub

Private Sub TextBoxWireDiameter_TextChanged(sender As Object, e As EventArgs) Handles TextBoxWireDiameter.TextChanged
    Dim WireArea As Double = Math.PI * (TextBoxWireDiameter.Text / 1000) * (TextBoxWireDiameter.Text / 1000) / 4
    Dim WireMass As Double = 8400 * WireArea * (TextBoxWireLength.Text / 1000)
    TextBoxWireResistance.Text = ((TextBoxWireResistivity.Text * (TextBoxWireLength.Text / 1000)) / WireArea)
    TextBoxWireCurrent.Text = TextBoxWireVoltage.Text / TextBoxWireResistance.Text
    TextBoxWirePower.Text = TextBoxWireVoltage.Text * TextBoxWireCurrent.Text
    TextBoxWireHeat.Text = TextBoxWirePower.Text * TextBoxWireCurrentDuration.Text * 60
    TextBoxWireTemperatureRise.Text = TextBoxWireHeat.Text / (WireMass * 450)
    TextBoxWireTemperature.Text = TextBoxWireTemperatureRise.Text + 22
End Sub

Private Sub TextBoxWireResistivity_TextChanged(sender As Object, e As EventArgs) Handles TextBoxWireResistivity.TextChanged
    Dim WireArea As Double = Math.PI * (TextBoxWireDiameter.Text / 1000) * (TextBoxWireDiameter.Text / 1000) / 4
    Dim WireMass As Double = 8400 * WireArea * (TextBoxWireLength.Text / 1000)
    TextBoxWireResistance.Text = ((TextBoxWireResistivity.Text * (TextBoxWireLength.Text / 1000)) / WireArea)
    TextBoxWireCurrent.Text = TextBoxWireVoltage.Text / TextBoxWireResistance.Text
    TextBoxWirePower.Text = TextBoxWireVoltage.Text * TextBoxWireCurrent.Text
    TextBoxWireHeat.Text = TextBoxWirePower.Text * TextBoxWireCurrentDuration.Text * 60
    TextBoxWireTemperatureRise.Text = TextBoxWireHeat.Text / (WireMass * 450)
    TextBoxWireTemperature.Text = TextBoxWireTemperatureRise.Text + 22
End Sub

Private Sub TextBoxWireVoltage_TextChanged(sender As Object, e As EventArgs) Handles TextBoxWireVoltage.TextChanged
    Dim WireArea As Double = Math.PI * (TextBoxWireDiameter.Text / 1000) * (TextBoxWireDiameter.Text / 1000) / 4
    Dim WireMass As Double = 8400 * WireArea * (TextBoxWireLength.Text / 1000)
    TextBoxWireResistance.Text = ((TextBoxWireResistivity.Text * (TextBoxWireLength.Text / 1000)) / WireArea)
    TextBoxWireCurrent.Text = TextBoxWireVoltage.Text / TextBoxWireResistance.Text
    TextBoxWirePower.Text = TextBoxWireVoltage.Text * TextBoxWireCurrent.Text
    TextBoxWireHeat.Text = TextBoxWirePower.Text * TextBoxWireCurrentDuration.Text * 60
    TextBoxWireTemperatureRise.Text = TextBoxWireHeat.Text / (WireMass * 450)
    TextBoxWireTemperature.Text = TextBoxWireTemperatureRise.Text + 22
End Sub

Private Sub TextBoxWireCurrentDuration_TextChanged(sender As Object, e As EventArgs) Handles TextBoxWireCurrentDuration.TextChanged
    Dim WireArea As Double = Math.PI * (TextBoxWireDiameter.Text / 1000) * (TextBoxWireDiameter.Text / 1000) / 4
    Dim WireMass As Double = 8400 * WireArea * (TextBoxWireLength.Text / 1000)
    TextBoxWireResistance.Text = ((TextBoxWireResistivity.Text * (TextBoxWireLength.Text / 1000)) / WireArea)
    TextBoxWireCurrent.Text = TextBoxWireVoltage.Text / TextBoxWireResistance.Text
    TextBoxWirePower.Text = TextBoxWireVoltage.Text * TextBoxWireCurrent.Text
    TextBoxWireHeat.Text = TextBoxWirePower.Text * TextBoxWireCurrentDuration.Text * 60
    TextBoxWireTemperatureRise.Text = TextBoxWireHeat.Text / (WireMass * 450)
    TextBoxWireTemperature.Text = TextBoxWireTemperatureRise.Text + 22
End Sub
End Class

Вот что я пытался решить проблему:

  1. Восстановление несколько раз. -> Не использовать.
  2. Окружить коды textbox.text с помощью val (), Cbdl () и TryParse (). -> Ничего не работает.
  3. Назначение значений текстовым полям в событии Form1.load. -> Не использовать.

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Пожалуйста, включите Option Strict. Это процесс из 2 частей. Сначала для текущего проекта. В обозревателе решений дважды щелкните Мой проект. Выберите Compile слева. В раскрывающемся списке Option Strict выберите ON. Второй для будущих проектов - Go в Меню инструментов -> Параметры -> Проекты и решения -> VB по умолчанию. В раскрывающемся списке Option Strict выберите ON. Это избавит вас от ошибок во время выполнения.

Я бы не стал запускать этот код каждый раз, когда пользователь вводит ди git. В идеале я хотел бы добавить кнопку расчета, чтобы пользователь мог завершить свои записи. Как минимум измените его на событие .Leave.

Не повторяйте код 5 раз. Это делает его очень трудно поддерживать, если вам нужно внести изменения в 5 разных местах. Сделайте отдельный Sub и вызовите его из событий.

Код проверки может быть в операторе If, поэтому вы не получите кучу нулей.

    If Not Double.TryParse(TextBoxWireDiameter.Text, WireDiameter) Then
        MessageBox.Show("Please enter only numbers.")
        Exit Sub
    End If

Расчеты можно комбинировать с кодом дисплея. Я держал это отдельно для ясности.

Private Sub TextBoxWireCurrentDuration_Leave(sender As Object, e As EventArgs) Handles TextBoxWireCurrentDuration.Leave
    Calculate()
End Sub

Private Sub Calculate()
    'Declare numeric variables
    Dim WireDiameter As Double
    Dim WireLength As Double
    Dim WireResistivity As Double
    Dim WireResistance As Double
    Dim WireVoltage As Double
    Dim WireCurrent As Double
    Dim WirePower As Double
    Dim WireCurrentDuration As Double
    Dim WireHeat As Double
    Dim WireTemperatureRise As Double
    Dim WireTemperature As Double
    'Parse user input
    Double.TryParse(TextBoxWireDiameter.Text, WireDiameter)
    Double.TryParse(TextWireLength.Text, WireLength)
    Double.TryParse(TextBoxWireResistivity.Text, WireResistivity)
    Double.TryParse(TextBoxWireVoltage.Text, WireVoltage)
    Double.TryParse(TextBoxWireCurrentDuration.Text, WireCurrentDuration)
    'Calculations
    Dim WireArea = Math.PI * ((WireDiameter / 1000) ^ 2)
    Dim WireMass = 8400 * WireArea * WireLength
    WireResistance = WireResistivity * (WireLength / 1000) / WireArea
    WireCurrent = WireVoltage / WireResistance
    WirePower = WireVoltage * WireCurrent
    WireHeat = WirePower * WireCurrentDuration * 60
    WireTemperatureRise = WireHeat / (WireMass * 450)
    WireTemperature = WireTemperatureRise + 22
    'Display results
    TextBoxWireResistance.Text = WireResistance.ToString("N4")
    TextBoxWireCurrent.Text = WireCurrent.ToString("N2")
    TextBoxWirePower.Text = WirePower.ToString("N3")
    TextBoxWireHeat.Text = WireHeat.ToString("N0")
    TextBoxWireTemperatureRise.Text = WireTemperatureRise.ToString("N4")
    TextBoxWireTemperature.Text = WireTemperature.ToString("N4")
End Sub
0 голосов
/ 29 апреля 2020

Ах, понял! Я так легко решил твою проблему. Просто используйте Try Catch во всех TextChange событиях. Например:

Private Sub TextBoxWireCurrentDuration_TextChanged(sender As Object, e As EventArgs) Handles TextBoxWireCurrentDuration.TextChanged
    Try
        Dim WireArea As Double = Math.PI * Val((TextBoxWireDiameter.Text / 1000)) * Val((TextBoxWireDiameter.Text / 1000)) / 4
        Dim WireMass As Double = 8400 * WireArea * (TextBoxWireLength.Text / 1000)
        TextBoxWireResistance.Text = ((TextBoxWireResistivity.Text * (TextBoxWireLength.Text / 1000)) / WireArea)
        TextBoxWireCurrent.Text = TextBoxWireVoltage.Text / TextBoxWireResistance.Text
        TextBoxWirePower.Text = TextBoxWireVoltage.Text * TextBoxWireCurrent.Text
        TextBoxWireHeat.Text = TextBoxWirePower.Text * TextBoxWireCurrentDuration.Text * 60
        TextBoxWireTemperatureRise.Text = TextBoxWireHeat.Text / (WireMass * 450)
        TextBoxWireTemperature.Text = TextBoxWireTemperatureRise.Text + 22
    Catch ex As Exception

    End Try
End Sub

Холодный человек. Теперь он отлично работает.

Easy Solution

...