问题描述
我有一个程序,其中我从不同的文本框中输入了很多值,并且我使用了try..catch
并检查了
每个textBox
仅用于输入数值。
如果我输入其他字符,则感谢Catch ex As system.invalidCastException
。
之后,我想更改发生错误的textBox
的背景颜色,例如ex.backcolor = color.red
。我已经搜索过这个并尝试了很多东西,但是我真的不知道如何处理该变量。
感谢帮助,谢谢!
解决方法
根据您的描述,几乎可以肯定您做错了几件事。我将提供一个完整的示例,但首先我将直接回答您的问题。您无需“检测”任何东西。 sender
参数是您想要的对象。每个事件处理程序中的sender
参数是引发事件的对象。这就是重点。如果您正在处理TextBoxes
的事件,并且想要更改引发事件的BackColor
的{{1}},则可以通过TextBox
参数访问该TextBox
,例如
sender
在这种情况下进行验证的最佳方法完全取决于您的需求。绝对没有理由抛出任何异常。首先,您需要确定是否要防止用户离开包含无效输入的控件。如果这样做,则应该处理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
属性,您可以在“工具箱”中右键单击这些属性,然后选择重置将属性设置回指定的值。