根据您的描述,您几乎可以肯定做错了一些事情。我将提供一个完整的示例,但我将首先直接回答您的问题。你不需要“检测”任何东西。 sender 参数是您想要的对象。每个事件处理程序中的 sender 参数是引发事件的对象。这就是重点。如果您正在处理 TextBoxes 的事件,并且您想更改引发事件的 TextBox 的 BackColor,那么您可以通过 sender 参数访问该 TextBox,例如
Dim tb = DirectCast(sender, TextBox)
tb.BackColor = Color.Red
在这种情况下进行验证的最佳方式取决于您的需要。不过,绝对没有理由抛出任何异常。首先,您需要决定是否要阻止用户离开包含无效输入的控件。如果你这样做了,那么你应该处理Validating 事件。您可以取消该事件以防止无效控件失去焦点。如果您不取消该事件,那么也会引发 Validated 事件,例如
Imports System.ComponentModel
Public Class Form1
Private Sub TextBoxes_Validating(sender As Object, e As CancelEventArgs) Handles TextBox3.Validating,
TextBox2.Validating,
TextBox1.Validating
Dim tb = DirectCast(sender, TextBox)
'Check whether the control contains any non-numeric characters.
If tb.Text.Any(Function(ch) Not Char.IsDigit(ch)) Then
tb.BackColor = Color.Red
tb.HideSelection = False
tb.SelectAll()
MessageBox.Show("Please enter only numeric characters.",
"Invalid Input",
MessageBoxButtons.OK,
MessageBoxIcon.Error)
tb.HideSelection = True
e.Cancel = True
End If
End Sub
Private Sub TextBoxes_Validated(sender As Object, e As EventArgs) Handles TextBox3.Validated,
TextBox2.Validated,
TextBox1.Validated
'If this event is raised then the control content is valid so reset the BackColor.
Dim tb = DirectCast(sender, TextBox)
tb.BackColor = SystemColors.Window
End Sub
End Class
如您所见,这些方法处理多个控件的事件,并且代码专门引用引发事件的控件。当用户试图离开一个控件时,它的内容会被验证,如果他们因为无效而不能离开,就会通知用户。
如果您希望让用户随意导航但使用BackColor 立即指示无效内容,则可以改为处理TextChanged 事件:
Private Sub TextBoxes_TextChanged(sender As Object, e As EventArgs) Handles TextBox3.TextChanged,
TextBox2.TextChanged,
TextBox1.TextChanged
Dim tb = DirectCast(sender, TextBox)
tb.BackColor = If(tb.Text.Any(Function(ch) Not Char.IsDigit(ch)),
Color.Red,
SystemColors.Window)
End Sub
编辑:
另一种选择是创建您自己的自定义控件并将功能直接构建到其中,因此您根本不必处理任何事件,例如
Imports System.ComponentModel
Public Class NumericTextBox
Inherits TextBox
<DefaultValue(GetType(Color), "Window")>
Public Property NormalBackColor As Color = SystemColors.Window
<DefaultValue(GetType(Color), "Red")>
Public Property ErrorBackColor As Color = Color.Red
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
BackColor = If(Text.Any(Function(ch) Not Char.IsDigit(ch)),
ErrorBackColor,
NormalBackColor)
End Sub
End Class
构建项目后,该控件将添加到工具箱窗口的顶部。然后,您可以将该控件添加到您的表单中,而不是常规的 TextBox 控件。无需任何额外代码,您就可以在这些控件中键入任何内容,如果您添加和删除非数字字符,它们会自动变为红色并再次变回。
使用我添加的属性,您可以在设计器中选择两个可能的BackColor 值,就像选择其他属性一样。请注意,DefaultValue 属性使您能够右键单击工具箱中的这些属性并选择 重置 以将属性设置回指定的值。