在 vb.net 中,在验证期间,如何确定调用验证的控件的名称?ActiveControl 命令返回获得焦点的 NEXT 控件的名称,而不是正在验证的控件。
2 回答
我假设您正在处理Validating
orValidated
事件?这些事件始终提供触发它们的对象,因此您只需执行以下操作:
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
s 都将具有一个.Name
属性。您必须转换对象,因为基本对象没有属性.Name
。为了更安全,您可以检查以确保它sender
实际上是Control
like :
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
属性传递给您,因此您无需知道其名称即可使用它。
谢谢 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
...