如何在代码中访问控件的标签

Mar*_*kus 7 ms-access vba access-vba

标签控件通常绑定到文本框或类似的其他控件.我知道有一种方法可以通过代码访问标签,但我不记得怎么做了.

有人可以帮忙吗?

也许是这样的:

Me.txtName.Child!lblName.Value
Run Code Online (Sandbox Code Playgroud)

要么

Me.txtName.Parent!lblName.Value
Run Code Online (Sandbox Code Playgroud)

当我通过表单上的控件枚举以进行验证时,我将使用它.然后我想将控件的标签用作错误消息中的信息,以向用户显示错误的位置.

Adr*_*der 9

使用文本框,您可以尝试

Text0.Controls.Item(0).Caption
Run Code Online (Sandbox Code Playgroud)

其中Control 0是链接标签


Dav*_*ton 5

@Astander提供了正确的答案,但请记住,并非所有控件都具有相同类型的Controls集合.

TextBoxes,ComboBoxes,ListBoxes,CheckBoxes在它们的控件集合中最多有1个项目(附加标签),但是如果没有附加标签,它们甚至都没有,所以.Controls(0)会抛出错误.

选项组具有多个控件,标签和选项按钮或框架内的切换按钮.当您从表单工具工具栏上删除表单上的选项组时,将使用附加标签创建框架,因此它将是索引为0的控件.但是,例如,如果删除默认标签,请添加选项按钮和然后添加一个标签,它不会是索引0,而是索引.Controls.Count - 1.

因此,对于标签选项组的标题,您要么要小心,如果删除默认标签,则在添加标签后也会删除框内的控件.如果不是这样,你需要命名标签并按名称引用它,因为选项/切换按钮的标签是选项组的Controls集合的一部分(这让我感到惊讶 - 我预计它们只会在控件中它们附加的选项/切换按钮的集合.

为了避免这个问题,我可以想象一下复杂的代码,你通过选项组的Controls集合循环查找附加到选项/切换按钮的标签,然后第二次循环选项组的Controls集合,这次只查看标签.像这样的东西:

  Public Function FindOptionGroupLabel(ctlOptionGroup As Control) As Control
    Dim ctl As Control
    Dim strOptionToggleLabels As String

    If ctlOptionGroup.ControlType <> acOptionGroup Then
       MsgBox ctlOptionGroup.Name & " is not an option group!", _
         vbExclamation, "Not an option group"
       Exit Function
    End If
    For Each ctl In ctlOptionGroup.Controls
      Select Case ctl.ControlType
        Case acOptionButton, acToggleButton
          If ctl.Controls.Count = 1 Then
             strOptionToggleLabels = strOptionToggleLabels & " " & ctl.Controls(0).Name
          End If
      End Select
    Next ctl
    strOptionToggleLabels = strOptionToggleLabels & " "
    For Each ctl In ctlOptionGroup.Controls
      Select Case ctl.ControlType
        Case acLabel
          If InStr(" " & strOptionToggleLabels & " ", ctl.Name) = 0 Then
             Set FindOptionGroupLabel = ctl
          End If
      End Select
    Next ctl
    Set ctl = Nothing
  End Function
Run Code Online (Sandbox Code Playgroud)

现在,如果没有附加标签,这会中断,因此返回标签名称而不是控件引用可能更有意义:

  Public Function FindOptionGroupLabel(ctlOptionGroup As Control) As String
    Dim ctl As Control
    Dim strOptionToggleLabels As String

    If ctlOptionGroup.ControlType <> acOptionGroup Then
       MsgBox ctlOptionGroup.Name & " is not an option group!", _
         vbExclamation, "Not an option group"
       Exit Function
    End If
    For Each ctl In ctlOptionGroup.Controls
      Select Case ctl.ControlType
        Case acOptionButton, acToggleButton
          If ctl.Controls.Count = 1 Then
             strOptionToggleLabels = strOptionToggleLabels & " " & ctl.Controls(0).Name
          End If
      End Select
    Next ctl
    strOptionToggleLabels = strOptionToggleLabels & " "
    For Each ctl In ctlOptionGroup.Controls
      Select Case ctl.ControlType
        Case acLabel
          If InStr(" " & strOptionToggleLabels & " ", ctl.Name) = 0 Then
             FindOptionGroupLabel = ctl.Name
          End If
      End Select
    Next ctl
    Set ctl = Nothing
  End Function
Run Code Online (Sandbox Code Playgroud)

这可能是通过选项组的Controls集合中的单个循环完成的,但是已经很晚了!什么似乎非常接近防弹,当然不是任何人给老鼠的屁股!:)