Private Sub STRPoints_ValueChanged(sender As Object, e As EventArgs) Handles STRPoints.ValueChanged
If STRPoints.Value >= 10 Then
STRScorelbl.Text = STRScorelbl.Text + (STRPoints.Value Mod 10)
ElseIf STRPoints.Value < 10 Then
STRScorelbl.Text = STRScorelbl.Text - (10 - STRPoints.Value)
End If
End Sub
该代码应该在屏幕上显示一个数字作为标签,该数字受2种不同因素的影响。首先是一个单选按钮,将其添加+2,另一个是UpDownNumeric框,将其值(Mod 10)添加到基数(偶然也为10)。
错误是:
System.InvalidCastException:'从字符串“”转换为'Double'类型的转换无效。'
我已经阅读了该错误,但是即使以大约100种不同的方式进行转换后,我似乎也无法修复该错误。追溯感谢任何可以帮助和解释我做错事情的人。
答案 0 :(得分:4)
STRScorelbl.Text
为空。因此,当您有以下代码时:
STRScorelbl.Text = STRScorelbl.Text +
在我们甚至不知道该操作员另一端的情况之前,您已经遇到麻烦了。无论您如何尝试强制转换或转换空字符串,都将卡住。
如果您像任何一个好的项目一样都转过Option Strict On
,则此错误将更容易发现,因为编译器会向您抱怨并在Visual Studio编辑器中强调了该错误。严格禁用选项是非常糟糕的做法。
打开Option Strict并修复此更改产生的任何其他有用的编译器错误之后,您可以按以下步骤对其进行修复:
Private Sub STRPoints_ValueChanged(sender As Object, e As EventArgs) Handles STRPoints.ValueChanged
Dim OriginalValue As Double = 0.0
If Not String.IsNullOrWhitespace(STRScorelbl.Text) Then OriginalValue = Double.Parse(STRScorelbl.Text)
If STRPoints.Value >= 10 Then
OriginalValue += (STRPoints.Value Mod 10)
Else
OriginalValue -= (STRPoints.Value Mod 10)
End If
STRScorelbl.Text = OriginalValue.ToString()
End Sub
除此之外,我不会使用标签控件(即文本)作为数字数据的权威存储。相反,我会有这样的属性:
Private _Score As Double = 0.0
Public Property Score As Double
Get
Return _Score
End Get
Set
_Score = value
STRScorelbl.Text = _Score.ToString()
End Set
End Property
然后,您可以简化ValueChanged()方法:
Private Sub STRPoints_ValueChanged(sender As Object, e As EventArgs) Handles STRPoints.ValueChanged
If STRPoints.Value >= 10 Then
Score += (STRPoints.Value Mod 10)
Else
Score -= (STRPoints.Value Mod 10)
End If
End Sub
答案 1 :(得分:1)
尝试使用val()函数,例如:
DateTime