【问题标题】:How to select TextBox on Label Click如何在标签单击上选择文本框
【发布时间】:2014-06-24 11:03:09
【问题描述】:

在 Microsoft Access 中,当您单击标签时,与该标签关联的文本框将获得焦点。据我所知,VB.NET 没有同样的功能。我知道我总是可以在标签的点击事件中添加一些东西,就像这样......

TextBox1.Focus()

但是我在表单上有几十个字段,如果我不需要将它添加到每个标签的点击事件中,它会变得容易得多。

我想有可能为所有标签创建一个事件,强制一个选项卡到下一个控件,并假设我正确设置了选项卡索引,那么这将起作用。向表单添加新字段时会出现问题,在这种情况下,所有选项卡索引都需要重新验证。

Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click, Label2.Click
    'code to tab to next field...
End Sub

有没有更简单的方法?

【问题讨论】:

  • @Raging Bull。每个文本框有 1 个标签。加上一些标签/其他控件(组合框、dateTimePicker 等)组合。我想如果我能解决文本框的问题,那么其他控件也应该效仿。
  • 所以你想在点击任何标签时将焦点设置到下一个控件(比如按 Tab 键),对吧?
  • @Raging Bull。基本上,但请参阅上面的评论,其中添加额外的字段(在此程序中经常发生)需要再次验证所有选项卡索引。
  • 重要的是,当您添加一个新控件时,您还会为其添加一个新标签,以设置它们各自的 tabindex 而不会与其他控件发生冲突。对我来说似乎没有太大的负担
  • 考虑将 Label 和 TextBox 放入 UserControl。

标签: vb.net winforms ms-access


【解决方案1】:

如何创建一个字典,其中标签是键,焦点控件是值,然后将 Click 事件处理程序添加到字典中的所有标签。每次添加标签/控件时,您需要做的就是在字典中添加另一个 KeyValuePair

简单示例:

 Public Class Form1
    Protected Friend DicLabelToControl As Dictionary(Of Label, Control)

    Protected Friend Sub InitLabelDic()
        DicLabelToControl = New Dictionary(Of Label, Control) From {{Label1, TextBox1}, {Label2, TextBox2}}
    End Sub

    Protected Friend Sub AddClickEventsToLabels()
        For Each lb As Label In DicLabelToControl.Keys
            AddHandler lb.Click, AddressOf HandleLabelClick
        Next
    End Sub

    Private Sub HandleLabelClick(sender As Object, e As EventArgs)
        DicLabelToControl(CType(sender, Label)).Focus()

    End Sub



    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        InitLabelDic()
        AddClickEventsToLabels()
    End Sub
End Class

【讨论】:

    【解决方案2】:

    首先,在表单上设置控件的 TabIndex 顺序,然后使用以下代码:

    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            For Each c As Control In Me.Controls
                If TypeOf c Is Label Then AddHandler c.Click, AddressOf Label_Click
            Next
        End Sub
    
        Private Sub Label_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            Me.SelectNextControl(sender, True, True, True, True)
        End Sub
    End Class
    

    现在,每当您单击标签时,顺序中的以下控件都会被聚焦。

    【讨论】:

    • 谢谢。我刚刚添加了完全相同的代码并准备测试。
    • 似乎这是在 .NET 中执行此操作的唯一方法(除非有人提出了一个很好的解决方案)。我的代码与此解决方案唯一不同的是,我递归地寻找标签来处理那些讨厌的子容器。
    • @aly-el-haddad 你打败了我,我正要提交同样的东西,哈哈。这是一个很好的解决方案,但只有一个缺点是 APrough 应该注意的:如果您添加、删除或重新排列任何控件,您将需要重做 Tab 顺序
    • @Grahamvs。是的。已经知道了。当然希望有更简单的方法,但现在必须这样做。
    • @APrough 好吧,对于顶级方法,您始终可以创建一个包含标签和所需控件类型的新控件。然后在labelclick event 上,将焦点设置为textbox(或您使用的任何控件)。这样你就不必担心设置标签顺序:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    相关资源
    最近更新 更多