在验证期间,如何确定调用验证的控件的名称?

时间:2014-01-19 14:08:32

标签: vb.net focus controls validating

在vb.net中,在验证期间,如何确定调用验证的控件的名称? ActiveControl命令返回获得焦点的NEXT控件的名称,而不是正在验证的控件。

2 个答案:

答案 0 :(得分:1)

我假设您正在处理ValidatingValidated事件?这些事件总是提供触发它们的对象,所以你只需要这样做:

Private Sub DoValidating(sender As Object, e As CancelEventArgs) _
                                                  Handles SomeControl.Validating
    Dim controlName As String = DirectCast(sender, Control).Name
    ' etc...
End Sub

标准事件处理程序始终将无类型对象作为sender参数返回。当您执行DirectCast(sender, Control)时,您假设事件是由Control类型对象引发的 - 可以是任何内容 - 文本框,按钮,滑块,标签等等。要获取控件的名称,您不必更具体,因为所有 Control都将具有.Name属性。您必须转换对象,因为基本对象具有.Name属性。为了更安全,您可以检查以确保sender实际上是Control之类的:

If TypeOf sender Is Control Then
    Dim controlName As String = DirectCast(sender, Control).Name
        ' etc...
End If

在您投射对象后,您可以访问您将其投射到的类型的任何属性。 DirectCast(sender,Control).NamemyTextBox1.Name相同。

现在,回答第二个问题,当您希望一个事件处理程序处理由多种类型的控件生成的事件时,上述方法很方便,这些控件都共享您有兴趣检查的公共基本属性。在这种情况下,基本Control类型也具有.Text属性,但您会注意到TextBox类型会覆盖.Text属性的功能,因此,你可以简单地做DirectCast(sender, Control).Text,最好转换成正确的类型。这样你就可以做到:

If TypeOf sender Is TextBox Then
    Dim textBoxText As String = DirectCast(sender, TextBox).Text
    ' etc...
End If

这允许您为各种事件构建通用处理程序,但也允许您根据生成事件的对象的类型执行特定操作。比如说,您想要为单选按钮,文本框,组合框等执行一些常见的验证任务;但是你还想对每种类型进行一些特定的验证,你可以检查发送对象的类型(如上所述),然后在将它转换为正确的类型后再使用它。如果您正在使用对象执行多项操作,则还可以通过将强制转换设置为局部变量来保存重复的工作:

If TypeOf sender Is TextBox Then
    Dim senderTxtBox As TextBox = DirectCast(sender, TextBox)
    Dim senderTxt As String = senderTxtBox.Text
    Dim controlName As String = senderTxtBox.Name
    senderTxtBox.ForeColor = Color.Blue
    ' etc...
End If

不确定是否可以解决问题?我猜你想要文本框的名称,以便你可以在代码中引用它 - 这里要注意的关键是你不需要知道要使用它的对象的名称。该名称只是一个字符串属性,编译器使用它来翻译您的代码。该名称只是获取对实际底层对象的引用的一种方法。对于事件处理程序,对象引用通过sender属性传递给您,因此您无需知道其名称即可使用它。

答案 1 :(得分:0)

谢谢J ..., 如果我错了,请纠正我,但是能够引用“sender”对象作为控件的技巧似乎是将变量从System.Object转换为Control对象,这是第三行完成的。 Dim ctl As Control = sender

Private Sub PhoneValidation(sender As System.Object, e As System.ComponentModel.CancelEventArgs)     Handles PhoneHomeTextBox.Validating, PhoneMobileTextBox.Validating, PhoneWorkTextBox.Validating

    'This routine strips away all non-numeric characters, and then reformats the remaining 10 digits in standard phone# format.  It rejects any non-null input which does not distill down to exactly 10 or 11 digits

    Dim ctl As Control = sender

    If ctl.Text = "" Then Exit Sub

    Dim x As String = ""
    Dim y As String = ""
    Dim z As String = "0123456789"

    For i = 0 To Len(ctl.Text) - 1
        x = ctl.Text.Substring(i, 1)
        If z.IndexOf(x) > -1 Then  'test each character to extract the numbers
            y = y & x
        End If
    Next

    ...