对象输入事件“字符串到十进制无效”

时间:2015-11-30 13:04:55

标签: vb.net

我有VB程序,它连接2类,收入和费用的小数。

由于某种原因,incomeTextBox.Enter和expensesTextBox.Enter有奇怪的行为,说:

  

请输入费用的数值

当我使用tab键或鼠标选择其他InputBox时,即使输入一个整数(IsNumeric = True)。

我也得到错误:

  

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

     

附加信息:从字符串“”到“Decimal”类型的转换无效。

另外,这是VB,而不是VB.Net,但没有VB标签??

Option Explicit On
Public Class MainForm

Public decexpenses, decincome As Decimal
Public dectotalexpenses As Decimal = 0
Public dectotalincome As Decimal = 0

Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    MsgBox("Use Enter key to enter values.")
End Sub

Private Sub expensesTextBox_Enter(sender As Object, e As EventArgs) Handles expensesTextBox.Enter
    Dim expenses = expensesTextBox.Text
    If IsNumeric(expenses) = False Then
        MsgBox("Please enter numeric value for expenses.")
    End If
    expensesTextBox.Text = ""
    decexpenses = CDec(expenses)
    dectotalexpenses = decexpenses + dectotalexpenses
End Sub

Private Sub incomeTextBox_Enter(sender As Object, e As EventArgs) Handles incomeTextBox.Enter
        Dim income = incomeTextBox.Text
        If IsNumeric(income) = False Then
        MsgBox("Please enter numeric value for income.")
    ElseIf IsNumeric(income) = True Then
        decincome = CDec(income)
        dectotalincome = decincome + dectotalexpenses
    End If
End Sub
End Class

2 个答案:

答案 0 :(得分:1)

我不使用Enter作为raise事件,而是使用Text_Changed并使用KeyDown for Enter。输入文本后,他们点击文本框中的enter键,例程将运行如下:

Private Sub expensesTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles expensesTextBox.KeyDown
    Dim dectotalexpenses As Decimal = 0
    Dim dectotalincome As Decimal = 0

    If e.KeyCode = Keys.Enter Then

        Dim value As String = TextBox1.Text
        Dim decincome As Decimal
        If Not Decimal.TryParse(value, decincome) Then
            MsgBox("Please enter numeric value for expenses.")
            Return
        End If
    End If
End Sub

答案 1 :(得分:0)

如果Enter第一次获得焦点,则会引发TextBox事件,此时文本可能为空,这会引发您的异常。

在您的代码中,您也可以使用If...Else,如果值不是数字则返回,因此无论如何都会执行CDec(expenses)导致异常。另外,代替IsNumeric使用Decimal.TryParse

Private Sub expensesTextBox_Enter(sender As Object, e As EventArgs) Handles expensesTextBox.Enter
    Dim value As String = expensesTextBox.Text
    Dim decincome As Decimal
    If Not Decimal.TryParse(value, decincome) Then
        MsgBox("Please enter numeric value for expenses.")
        Return
    End If

    dectotalexpenses = decincome + dectotalexpenses
End Sub

您还应该使用其他活动,例如TextBox.TextChanged