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

时间:2009-10-28 12:52:21

标签: ms-access vba access-vba

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

有人可以帮忙吗?

可能是这样的:

Me.txtName.Child!lblName.Value

或者

Me.txtName.Parent!lblName.Value

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

5 个答案:

答案 0 :(得分:9)

使用文本框,您可以尝试

Text0.Controls.Item(0).Caption

其中Control 0是链接标签

答案 1 :(得分: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

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

  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

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

答案 2 :(得分:1)

如果它的访问我认为是

窗体!YourFormName!YourField.Value

或者如果你有一个子表格:

窗体!yourMainForm!YourSubForm!YourField.Value

答案 3 :(得分:1)

以下是我编写的一些代码,用于重命名与OptionButtons关联的标签。标签具有父属性,该属性指向它标记的控件。该函数非常通用,而子程序是为OptionButtons编写的。这段代码应该适用于大多数事情,除非标签没有关联,我没有提供任何恢复。

公共函数paNameControlLabel(FormName As String,ControlName As String)As String     Dim frm As Form     昏暗的ctl作为控制     昏暗的ctlLabel作为控制     Dim ctlParent As Control

Set frm = Forms(FormName)
For Each ctl In frm.Controls
    Select Case ctl.ControlType
        Case acLabel
            If ctl.Parent.Name = ControlName Then
                Debug.Print "Label " & ctl.Name & " Renamed to lbl" & ControlName
                ctl.Name = "lbl" & ControlName
                paNameControlLabel = ctl.Name
            End If
    End Select
Next ctl

结束功能 Public Sub paNameOptionButtonLabels(FormName As String)     Dim frm As Form     Dim ctl As Control

Set frm = Forms(FormName)
For Each ctl In frm.Controls
    If ctl.ControlType = acOptionButton Then
        Debug.Print paNameControlLabel(FormName, ctl.Name)
    End If
Next ctl
Set frm = Nothing

End Sub

答案 4 :(得分:0)

可能晚了,但是我为此苦苦挣扎,有效的方法是检查控件的类型以确保它支持标签,然后使用

ctl.Properties(3) ' For the label name
Forms(ctl.Form).Controls(ctl.Properties(3)).Caption ' For the label text

在“即时”窗口中,使用文本索引而不是幻数:ctl.properties("LabelName")起作用。

首先,我在文本框的属性中寻找标签并删除了。 然后,我在表单的控件中查看并找到了它。

希望这可以帮助某人!