2017-04-14 102 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,只執行輸入按下的邏輯,但這會改變程序的邏輯和設計,因此取決於您。