Как получить доступ к метке элемента управления в коде - PullRequest
7 голосов
/ 28 октября 2009

Часто элемент управления меткой привязан к текстовому полю или подобному другому элементу управления. Я знаю, что есть способ получить доступ к метке через код, но я не помню, как это сделать.

Кто-нибудь может помочь?

Может быть что-то вроде:

Me.txtName.Child!lblName.Value

Или

Me.txtName.Parent!lblName.Value

Я буду использовать это, когда перечисляю элементы управления в форме для целей проверки. Затем я хочу использовать метку для элемента управления в качестве информации в сообщении об ошибке, чтобы показать пользователю, где находится ошибка.

Ответы [ 5 ]

9 голосов
/ 28 октября 2009

С текстовым полем вы можете попробовать

Text0.Controls.Item(0).Caption

, где Control 0 - это связанная метка

5 голосов
/ 29 октября 2009

@ Astander дал правильный ответ, но имейте в виду, что не все элементы управления имеют одинаковые коллекции элементов управления.

TextBoxes, ComboBoxes, ListBoxes, CheckBoxes имеют максимум 1 элемент в своей коллекции элементов управления (прикрепленная метка), но если метка не прикреплена, они даже не будут иметь этого, поэтому .Controls (0) будет выдать ошибку.

Группа параметров имеет несколько элементов управления, метку и кнопку выбора или кнопки переключения внутри рамки. Когда вы удаляете группу параметров в форме с панели инструментов инструментов формы, рамка создается с прикрепленной меткой, поэтому она будет элементом управления с индексом 0. Но если, например, вы удалите метку по умолчанию, добавьте кнопки параметров и затем добавьте обратно метку, это будет не индекс 0, а индекс .Controls.Count - 1.

Таким образом, для заголовка метки группы параметров вы также должны быть осторожны: если вы удаляете метку по умолчанию, вы также удаляете элементы управления внутри фрейма после добавления метки обратно. Если это не так, вам нужно назвать ярлык и ссылаться на него по имени, потому что ярлыки для кнопок выбора / переключения являются частью коллекции элементов управления группы параметров (меня это удивило - я ожидал, что они будут только в элементах управления). коллекция кнопки выбора / переключения, к которой они были прикреплены).

Чтобы избежать этой проблемы, я могу представить себе извилистый код, в котором вы просматривали коллекцию 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

Возможно, это можно сделать одним циклом в коллекции элементов управления группы параметров, но уже поздно! То, что там кажется довольно близким к пуленепробиваемому, не то, чтобы кто-то давал задницу крысе, конечно! :)

1 голос
/ 08 июля 2014

Вот некоторый код, который я написал для переименования меток, связанных с OptionButtons. Метка имеет родительское свойство, указывающее на элемент управления, который она помечает. Функция довольно общая, а подпрограмма написана для OptionButtons. Этот код должен работать почти для всего, кроме того, что когда метка не связана, я не предоставил никакого восстановления.

Открытая функция paNameControlLabel (FormName As String, ControlName As String) Как String Dim frm As Form Dim ctl As Control Dim ctlLabel As Control 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

End Function 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

1 голос
/ 28 октября 2009

Если его доступ, я думаю, что это

Forms! YourFormName! YourField.Value

Или, если у вас есть подчиненная форма:

Forms! YourMainForm! YourSubForm! YourField.Value

0 голосов
/ 23 мая 2019

Возможно, поздно, но я только что боролся с этим, и то, что работало, было проверить тип элемента управления, чтобы убедиться, что он поддерживает метки, а затем использовать

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

В окне Немедленное использование текстового индекса вместо магического числа: ctl.properties("LabelName") сработало.

Сначала я искал метку среди свойств текстового поля и вычеркнул. Затем я посмотрел среди элементов управления формы и нашел его там.

Надеюсь, это кому-нибудь поможет!

...