在vb.net中,在验证期间,如何确定调用验证的控件的名称? ActiveControl命令返回获得焦点的NEXT控件的名称,而不是正在验证的控件。
答案 0 :(得分:1)
我假设您正在处理Validating
或Validated
事件?这些事件总是提供触发它们的对象,所以你只需要这样做:
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).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
属性传递给您,因此您无需知道其名称即可使用它。
答案 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
...