0

我在一个表单中有很多文本框(大约 10 个)。我希望文本框中的文本在获得焦点时被突出显示。代码如下:

Private Sub txtBillNo_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtBillNo.GotFocus
   HoverText(txtBillNo)
End Sub

Private Sub HoverText(ByRef ctrl as TextBox)
   ctrl.SelectAll()
End Sub

它工作得很好,但我虽然可以在这里做一些代码优化。因为,我有大约 10 个文本框(以及许多其他包含多个文本框的表单),所以我必须HoverText(TextBox)Private Sub.. Handles TextBox.GotFocus每个表单中的每个文本框中输入。

我寻找任何表单事件(或任何其他方式),当焦点通过 MouseClick 或 TAB 赋予表单中的另一个控件(文本框)时触发的任何表单事件(或任何其他方式),因此HoverText(TextBox)只需为表单编写一次。

4

2 回答 2

3

您可以在Handles子句中列出所有文本框:

Private Sub atextbox_GotFocus(ByVal sender As System.Object, ByVal e As _
 System.EventArgs) _
           Handles txt1.GotFocus, _
                   txt2.GotFocus, _
                   txt3.GotFocus, _
                   (...remaining text boxes..)
                   txt9.GotFocus, _
                   txt10.GotFocus

或者您可以在加载表单时向所有文本框添加处理程序:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For Each t In Me.Controls.OfType(Of TextBox)()
        AddHandler t.GotFocus, AddressOf HoverText
    Next
End Sub

Private Sub HoverText(ByVal sender As System.Object, ByVal e As System.EventArgs)
    DirectCast(sender, TextBox).SelectAll()
End Sub
于 2013-01-13T10:07:31.750 回答
2

.NET 改变类行为的方法是派生一个新类。VB.NET 和 Winforms 也很好地支持这一点。对于从 Control 派生的任何类,您可以通过覆盖受保护的 OnXxx 事件来拦截事件,其中 Xxx 是事件名称。顺便说一句,您应该使用 Enter 事件。使用 Project + Add Class 并使代码如下所示:

Public Class MyTextBox
    Inherits TextBox

    Protected Overrides Sub OnEnter(ByVal e As System.EventArgs)
        Me.Select(0, Me.Text.Length)
        MyBase.OnEnter(e)
    End Sub
End Class

编译。返回您的表单并注意您现在在工具箱顶部有一个新控件。将它拖到表单上并注意它现在的行为方式是否符合您的要求,而无需在您的表单中编写任何代码或事件处理程序。

于 2013-01-13T10:30:39.073 回答