当文本框获得焦点时选择文本框内容。

4
我在Making a WinForms TextBox behave like your browser's address bar中找到了一个类似于我的问题的解决方案。现在我想要修改或者改进它,使其更加通用。我希望将同样的操作应用于表单中的所有文本框,而不需要为每个文本框编写代码...我不知道有多少个。只要我在表单中添加一个文本框,它就应该具有类似选择的相似动作。
所以我想知道怎么做?

Windows表单?Web表单?什么? - John Saunders
3个回答

8
以下代码继承自TextBox并实现了你在使WinForms文本框的行为类似于浏览器地址栏中提到的代码。
将MyTextBox类添加到项目后,您可以全局搜索System.Windows.Forms.Text并替换为MyTextBox。
使用此类的优点是您不会忘记为每个文本框连接所有事件。如果您决定对所有文本框进行另一次微调,则只需在一个地方添加该功能即可。
Imports System
Imports System.Windows.Forms

Public Class MyTextBox
    Inherits TextBox

    Private alreadyFocused As Boolean

    Protected Overrides Sub OnLeave(ByVal e As EventArgs)
        MyBase.OnLeave(e)

        Me.alreadyFocused = False

    End Sub

    Protected Overrides Sub OnGotFocus(ByVal e As EventArgs)
        MyBase.OnGotFocus(e)

        ' Select all text only if the mouse isn't down.
        ' This makes tabbing to the textbox give focus.
        If MouseButtons = MouseButtons.None Then

            Me.SelectAll()
            Me.alreadyFocused = True

        End If

    End Sub

    Protected Overrides Sub OnMouseUp(ByVal mevent As MouseEventArgs)
        MyBase.OnMouseUp(mevent)

        ' Web browsers like Google Chrome select the text on mouse up.
        ' They only do it if the textbox isn't already focused,
        ' and if the user hasn't selected all text.
        If Not Me.alreadyFocused AndAlso Me.SelectionLength = 0 Then

            Me.alreadyFocused = True
            Me.SelectAll()

        End If

    End Sub

End Class

3
假设您将使用与您链接的问题中接受的解决方案,那么您需要做的就是每次创建新文本框时,使用AddHandler将相同的3个事件处理程序添加到每个新文本框中。
然后,您需要更改事件处理程序,以便将文本框引用作为“CType(sender, TextBox)”,而不是“this.textBox1”,这意味着它们将使用生成事件的文本框。
编辑:我在此处添加了该行代码,因为它更容易阅读。
Private Sub TextBox_GotFocus (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.GotFocus, TextBox2.GotFocus, TextBox3.GotFocus

嗯...很有趣...我试过了...甚至还有效果...但是我们能不能对表单做点什么,以免需要为它们添加事件处理程序呢? - KoolKabin
@KoolKabin:我以为你是指动态地添加文本框?否则,如果它们是在设计器中创建的,您只需像这样将它们全部链接到同一个事件处理程序:Private Sub TextBox_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.GotFocus, TextBox2.GotFocus, TextBox3.GotFocus - Hans Olsson
谢谢,它起作用了。我们能在表单级别事件上再探索一步吗? - KoolKabin
@KoolKabin:你的意思是想在多个表单中重复使用同一个事件吗?我认为由于大多数表单事件是由“它们自己”处理而不是由所有者处理(例如表单处理按钮单击事件),所以我不确定是否有意义。但是,你当然可以像从同一个基类继承两个表单并让基类处理事件一样做,尽管可能会有点混乱。 - Hans Olsson

2
我们使用这个自定义文本框控件:
Public Class TextBoxX
    Inherits System.Windows.Forms.TextBox

    Private Sub TextBoxX_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp
        SelectAll()
    End Sub
end class

您可以在GitHub上查看我们的TextBox(大杀器)的完整项目:https://github.com/logico-dev/TextBoxX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接