Vb.net 对象输入事件“;“字符串到小数点无效”;

Vb.net 对象输入事件“;“字符串到小数点无效”;,vb.net,Vb.net,我有一个VB程序,它连接了收入和支出两个类别的小数 出于某种原因,incomeTextBox.Enter和expensesTextBox.Enter具有奇怪的行为,表示: 请输入费用的数值 当我使用tab键或鼠标选择其他InputBox时,即使在输入整数后也是如此(它是numeric=True) 我还得到一个错误: Microsoft.VisualBasic.dll中发生类型为“System.InvalidCastException”的未处理异常 其他信息:从字符串“”到类型“Decimal”的

我有一个VB程序,它连接了收入和支出两个类别的小数

出于某种原因,incomeTextBox.Enter和expensesTextBox.Enter具有奇怪的行为,表示:

请输入费用的数值

当我使用tab键或鼠标选择其他InputBox时,即使在输入整数后也是如此(它是numeric=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

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

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

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

我将使用Text\u Changed,并使用向下键输入,而不是使用Enter键输入raise事件。输入文本后,他们单击文本框上的输入,例程将运行以下示例:

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

我们能看到代码吗?对不起,我忘了(;如果用户“输入”,则会引发
Enter
事件)
TextBox
第一次,可能此时文本为空,这会引发异常。使用
Decimal.TryParse
@thomasthera:
Enter
-事件与使用
Enter
-键无关。它意味着用户输入
TextBox
,如果
TextBox
获得焦点,就会发生这种情况。因此我f它没有焦点,用户点击它或使用键盘(ALT键)切换焦点。您可能希望使用不同的事件,如
TextChanged
-事件,或者使用另一种方法,如使用触发逻辑的单独按钮。哦,顺便说一句,在winforms中,您可以通过处理
验证
验证
事件来验证用户输入。