0

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

4

2 回答 2

1

我假设您正在处理ValidatingorValidated事件?这些事件始终提供触发它们的对象,因此您只需执行以下操作:

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类型对象引发的——可以是任何东西——文本框、按钮、滑块、标签等等。要获取控件的名称,您不必更具体,因为所有 Controls 都将具有一个.Name属性。您必须转换对象,因为基本对象没有属性.Name。为了更安全,您可以检查以确保它sender实际上是Controllike :

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

转换对象后,您可以访问已转换为的类型的任何属性。 DirectCast(sender,Control).Name是一样的说法myTextBox1.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属性传递给您,因此您无需知道其名称即可使用它。

于 2014-01-19T14:42:13.367 回答
0

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

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

    ...
于 2014-01-20T11:32:00.983 回答