检测“发件人”是否尝试...

问题描述

我有一个程序,其中我从不同的文本框中输入了很多值,并且我使用了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属性,您可以在“工具箱”中右键单击这些属性,然后选择重置将属性设置回指定的值。