2009-10-28 1 views
7

Oft ist ein Label-Steuerelement an ein Textfeld oder ein ähnliches anderes Steuerelement gebunden. Ich weiß, dass es eine Möglichkeit gibt, über Code auf das Etikett zuzugreifen, aber ich weiß nicht mehr, wie ich es machen soll.So greifen Sie auf das Label eines Steuerelements im Code zu

Kann jemand helfen?

Vielleicht so etwas wie:

Me.txtName.Child!lblName.Value 

Oder

Me.txtName.Parent!lblName.Value 

ich dies verwenden, wenn ich durch die Kontrollen Zwecke auf einem Formular für die Validierung am aufzählt. Dann möchte ich die Bezeichnung für ein Steuerelement als Information in der Fehlermeldung verwenden, um dem Benutzer anzuzeigen, wo der Fehler liegt. Ich denke, es ist

Forms! YourFormName! YourField.Value

Antwort

8

Mit dem Textfeld können Sie

Text0.Controls.Item(0).Caption 

versuchen, wo die Kontrolle 0 das verknüpfte Label

+0

Ja, das ist es. Vielen Dank! – Markus

1

Wenn der Zugriff ist Oder wenn Sie ein Unterformular haben:

Formulare! YourMainForm! Sie rSubForm! YourField.Value

5

@Astander hat die richtige Antwort angegeben, aber bedenken Sie, dass nicht alle Steuerelemente dieselbe Art von Controls-Sammlungen haben.

TextBoxen, ComboBoxen, ListBoxen, CheckBoxes haben maximal 1 Element in ihrer Steuerelementsammlung (das angehängte Label), aber wenn das Label nicht angehängt ist, haben sie nicht einmal das, also .Controls (0) wird einen Fehler auslösen.

Eine Optionsgruppe hat mehrere Steuerelemente, das Label und die Optionsschaltfläche oder Umschaltflächen innerhalb des Rahmens. Wenn Sie eine Optionsgruppe in einem Formular aus der Formwerkzeugleiste löschen, wird der Rahmen mit einem angehängten Label erstellt, sodass es das Steuerelement mit dem Index 0 ist. Wenn Sie jedoch beispielsweise das Standardlabel löschen, fügen Sie die Optionsfelder und hinzu Fügen Sie dann ein Label zurück, es wird nicht Index 0 sein, aber index .Controls.Count - 1.

Also, für die Beschriftung eines Optionsgruppenlabels, möchten Sie entweder vorsichtig sein, dass wenn Sie das Standardlabel löschen , löschen Sie auch die Steuerelemente innerhalb des Rahmens, nachdem Sie das Label wieder hinzugefügt haben. Wenn dies nicht der Fall ist, müssen Sie die Bezeichnung benennen und auf den Namen verweisen, da die Beschriftungen für die Options-/Umschalttasten Teil der Controls-Sammlung der Optionsgruppe sind (das hat mich überrascht - ich habe erwartet, dass sie nur in den Steuerelementen enthalten sind) Sammlung der Options-/Umschalttaste, an die sie angehängt wurden).

Um dieses Problem zu vermeiden, stelle ich mir gewundenen Code vor, bei dem Sie die Controls-Auflistung der Optionsgruppe durchsucht und nach den an die Options-/Umschalttasten angehängten Beschriftungen suchen und dann ein zweites Mal durch die Steuerelementsammlung der Optionsgruppe laufen nur auf die Etiketten schauen.Etwas wie folgt aus:

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 

Nun bricht diese, wenn kein Etikett angebracht ist, so dass es wahrscheinlich mehr Sinn machen würde, für den Markennamen zurückzukehren, anstatt die Steuer Referenz:

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 

Dies könnte wahrscheinlich mit einer einzelnen Schleife durch die Controls-Sammlung der Optionsgruppe erfolgen, aber es ist spät! Was dort ist, scheint ziemlich kugelsicher zu sein, nicht dass irgendjemand einen Rattenarsch gibt, natürlich! :)

1

Hier ist ein Code, den ich schrieb, um die mit OptionButtons verbundenen Bezeichnungen umzubenennen. Eine Beschriftung hat eine übergeordnete Eigenschaft, die auf das Steuerelement verweist, das sie kennzeichnet. Die Funktion ist ziemlich allgemein, während das Unterprogramm für OptionButtons geschrieben wird. Dieser Code sollte für fast alles funktionieren, außer wenn das Label nicht zugeordnet ist, habe ich keine Wiederherstellung bereitgestellt.

Public Function paNameControlLabel (Formname As String, Control As String) As 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

Verwandte Themen