Textbox.text 的非空值被读取为空。从字符串“”到类型 'Double' 的转换无效

Non-empty value of Textbox.text being read as empty. Conversion from string "" to type 'Double' is not valid

我正在尝试构建一个 vb .net 应用程序,其中我的主窗体中有几个文本框,它们在设计时填充了数值。
下图显示了我的表单片段:

但是当我构建应用程序时,填充的数值被读取为空字符串 ("")。
这是确切的错误:

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.

这是汽车的片段 window:

在汽车window中注意TextBoxWireDiameter的文本属性的值为“”。但是我在设计时为文本 属性 添加了值。我填写的其他文本框也会出现同样的错误。知道为什么会这样吗?

这是我的代码:(所有子程序都包含完全相同的代码)

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. 用 val()、Cbdl() 和 TryParse() 包围了 textbox.text 代码。 --> 没有任何效果。
  3. 正在为 Form1.load 事件中的文本框赋值。 --> 没用。

啊,明白了!我很容易地解决了你的问题。只需在所有 TextChange 事件中使用 Try Catch。例如:

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

冷静的人。现在一切正常。

请启用 Option Strict。这是一个两部分的过程。首先针对当前项目 - 在解决方案资源管理器中双击我的项目。选择左侧的编译。在 Option Strict 下拉菜单中 select ON。第二个用于未来的项目 - 转到工具菜单 -> 选项 -> 项目和解决方案 -> VB 默认值。在 Option Strict 下拉菜单中 select ON。这将使您在 运行 时避免错误。

我不会 运行 每次用户输入数字时都使用此代码。理想情况下,我会添加一个计算按钮,以便用户可以完成他们的输入。至少将其更改为 .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