Vb.net 对象输入事件“;“字符串到小数点无效”;
我有一个VB程序,它连接了收入和支出两个类别的小数 出于某种原因,incomeTextBox.Enter和expensesTextBox.Enter具有奇怪的行为,表示: 请输入费用的数值 当我使用tab键或鼠标选择其他InputBox时,即使在输入整数后也是如此(它是numeric=True) 我还得到一个错误: Microsoft.VisualBasic.dll中发生类型为“System.InvalidCastException”的未处理异常 其他信息:从字符串“”到类型“Decimal”的转换无效 另外,这是VB,不是VB.Net,但是没有VB标记Vb.net 对象输入事件“;“字符串到小数点无效”;,vb.net,Vb.net,我有一个VB程序,它连接了收入和支出两个类别的小数 出于某种原因,incomeTextBox.Enter和expensesTextBox.Enter具有奇怪的行为,表示: 请输入费用的数值 当我使用tab键或鼠标选择其他InputBox时,即使在输入整数后也是如此(它是numeric=True) 我还得到一个错误: Microsoft.VisualBasic.dll中发生类型为“System.InvalidCastException”的未处理异常 其他信息:从字符串“”到类型“Decimal”的
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中,您可以通过处理验证
和验证
事件来验证用户输入。