首页 > 解决方案 > 检测 Try...Catch 的“发件人”

问题描述

我有一个程序,我在其中输入来自不同文本框的大量值,并且我使用try..catch并检查每一个textbox是否只输入数值。如果我输入不同的字符,它会得到它,这要归功于Catch ex As System.InvalidCastException. 在此之后,我想更改textbox出现错误的背景颜色,例如ex.backcolor = color.red. 我已经搜索过这个并尝试了很多东西,但我真的不知道如何处理这个变量。感谢帮助,谢谢!

标签: vb.nettry-catch

解决方案


根据您的描述,您几乎可以肯定做错了一些事情。我将提供一个完整的示例,但我将首先直接回答您的问题。你不需要“检测”任何东西。sender参数是您想要的对象。每个事件处理程序中的sender参数是引发事件的对象。这就是重点。如果您正在处理事件TextBoxes并且想要更改引发事件的事件,那么您可以通过参数访问BackColor它,例如TextBoxTextBoxsender

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属性使您能够右键单击工具箱中的那些属性并选择重置以将属性设置回指定的值。


推荐阅读