2017-04-14 116 views
-1

我很新的Visual Basic,所以我知道这个问题的补救......当我尝试使用下面的代码我收到以下错误消息到运行我的程序:的Visual Basic错误消息

的Microsoft.VisualBasic.dll中出现类型'System.InvalidCastException'的未处理的异常

其他信息:从字符串“”转换为类型'Double'无效。

我意识到类似的问题已经被问,但我想显示我的代码是如下因素:

Private Sub txtGrade1_TextChanged(sender As Object, e As EventArgs) Handles txtGrade1.TextChanged 

    Dim numGrade As Decimal 

    numGrade = CDec(txtGrade1.Text * 0.15) + CDec(txtGrade2.Text * 0.25) + CDec(txtGrade3.Text * 0.2) + CDec(txtGrade4.Text * 0.4) 
    MsgBox("Your Grade is" + numGrade) 

End Sub 

我不知道是怎么回事。该程序将允许我在运行时在文本框中输入1位数字,但随后出现错误消息

+0

将numGrade声明为字符串 –

+1

您必须在()之外进行乘法运算。您当前的代码正试图乘以txtGrade.Text * 0.15,然后使用CDec()进行转换。先转换再乘以:'numGrade = CDec(txtGrade1.Text)* 0.15 +'等等。 –

+0

每个txtGrade#文本框都需要有一个有效的数字 - 一个空格不会。然而,你可以使用一个小小的欺骗Val()函数,它会将一个空格变成零。例如。 'CDec(Val(txtGrade1.Text))* 0.15'。更聪明的是,要学会使用Decimal.TryParse方法(https://msdn.microsoft.com/en-us/library/9zbda557(v=vs.110).aspx)。此外,请试试MsgBox:'“您的等级是”&numGrade'。 – rskar

回答

1

那么,这将解决您的类型不匹配问题。但你可能不希望显示一个消息框时间txtGrade1.Text变化......

Private Sub txtGrade_TextChanged(sender As Object, e As EventArgs) Handles txtGrade1.TextChanged 
    Dim grade1, grade2, grade3, grade4 As Double 
    If Double.TryParse(txtGrade1.Text, grade1) _ 
      AndAlso Double.TryParse(txtGrade2.Text, grade2) _ 
      AndAlso Double.TryParse(txtGrade3.Text, grade3) _ 
      AndAlso Double.TryParse(txtGrade4.Text, grade4) Then 
     Dim grade = grade1 * 0.15 + grade2 * 0.25 + grade3 * 0.2 + grade4 * 0.4 
     MsgBox(String.Format("Your Grade is {0}", grade)) 
    End If 
End Sub 

为了提高在你的代码,你可以做到这一点,当任何TextBoxes验证而不是改变,因为如果您输入99,则在输入前9个字符后触发更改事件。验证的处理程序在您移出TextBox时触发。

Private Sub txtGradesValidated(sender As Object, e As EventArgs) _ 
     Handles txtGrade1.Validated, txtGrade2.Validated, txtGrade3.Validated, txtGrade4.Validated 
    Dim grade1, grade2, grade3, grade4 As Double 
    If Double.TryParse(txtGrade1.Text, grade1) _ 
      AndAlso Double.TryParse(txtGrade2.Text, grade2) _ 
      AndAlso Double.TryParse(txtGrade3.Text, grade3) _ 
      AndAlso Double.TryParse(txtGrade4.Text, grade4) Then 
     Dim grade = grade1 * 0.15 + grade2 * 0.25 + grade3 * 0.2 + grade4 * 0.4 
     MsgBox(String.Format("Your Grade is {0}", grade)) 
    End If 
End Sub 

仍然不理想,你会看到如果你测试它。您也可以考虑KeyPress或KeyUp,只执行输入按下的逻辑,但这会改变程序的逻辑和设计,因此取决于您。