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
以下是我尝试解决的问题:
- 重建了好几次。 --> 没用。
- 用 val()、Cbdl() 和 TryParse() 包围了 textbox.text 代码。 --> 没有任何效果。
- 正在为 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
我正在尝试构建一个 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
以下是我尝试解决的问题:
- 重建了好几次。 --> 没用。
- 用 val()、Cbdl() 和 TryParse() 包围了 textbox.text 代码。 --> 没有任何效果。
- 正在为 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