2009-10-28 8 views
7

A menudo, un control de etiqueta está vinculado a un cuadro de texto u otro control similar. Sé que hay una forma de acceder a la etiqueta a través del código, pero no recuerdo cómo hacerlo.Cómo acceder a la etiqueta de un control en el código

¿Alguien puede ayudar?

Tal vez algo como:

Me.txtName.Child!lblName.Value 

O

Me.txtName.Parent!lblName.Value 

voy a utilizar esto cuando estoy enumerando a través de los controles de un formulario para fines de validación. Luego quiero usar la etiqueta para un control como información en el mensaje de error para mostrar al usuario dónde está el error.

Respuesta

8

Con el cuadro de texto se puede tratar

Text0.Controls.Item(0).Caption 

donde el control es 0 la etiqueta vinculada

+0

Sí, eso es todo. ¡Gracias! – Markus

1

Si su acceso Creo que es

Forms! YourFormName! YourField.Value

O si tiene un formulario secundario, es:

¡Formularios! YourMainForm! You rSubForm! YourField.Value

5

@Astander ha proporcionado la respuesta correcta, pero tenga en cuenta que no todos los controles tienen el mismo tipo de colecciones de controles.

TextBoxes, ComboBoxes, ListBoxes, CheckBox tienen un máximo de 1 elemento en su colección de controles (la etiqueta adjunta), pero si la etiqueta no está adjunta, ni siquiera tendrán eso, entonces .Controles (0) arrojará un error.

Un grupo de opciones tiene controles múltiples, la etiqueta y el botón de opción o botones de alternar dentro del marco. Cuando suelta un grupo de opciones en un formulario de la barra de herramientas de herramientas de formulario, el marco se crea con una etiqueta adjunta, por lo que será el control con el índice 0. Pero si, por ejemplo, elimina la etiqueta predeterminada, agregue botones de opción y a continuación, vuelva a agregar una etiqueta, no será el índice 0, pero index .Controls.Count - 1.

Por lo tanto, para el título de una etiqueta de grupo de opción, puede tener cuidado de que si elimina la etiqueta predeterminada , también elimina los controles dentro del marco después de agregar la etiqueta nuevamente. Si ese no es el caso, debe nombrar la etiqueta y referirse a ella por su nombre, porque las etiquetas de los botones de opción/alternar forman parte de la colección de controles del grupo de opciones (esto me sorprendió; esperaba que solo estuvieran en los controles). colección del botón de opción/alternar al que estaban adjuntos).

Para evitar este problema, puedo imaginar un código intrincado en el que haya realizado un bucle en la colección de controles del grupo de opciones buscando las etiquetas asociadas a los botones de opción/alternar, y luego en bucle la colección de controles del grupo de opciones por segunda vez. mirando solo las etiquetas.Algo como esto:

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 

Ahora, esto rompe si no hay una etiqueta adjunta, por lo que probablemente tendría más sentido para que retorne el nombre de la etiqueta, en lugar de la referencia de control:

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 

Esto probablemente podría hacerse con un solo bucle a través de la colección de controles del grupo de opciones, ¡pero es tarde! Lo que hay parece ser muy cercano a las balas, ¡no es que a nadie le importe el culo de una rata, por supuesto! :)

1

Aquí hay un código que escribí para cambiar el nombre de las etiquetas asociadas con OptionButtons. Una etiqueta tiene una propiedad primaria que apunta al control que etiqueta. La función es bastante general mientras que la subrutina está escrita para OptionButtons. Este código debería funcionar para casi cualquier cosa, excepto que cuando la etiqueta no está asociada, no he proporcionado ninguna recuperación.

Función Pública paNameControlLabel (FormName como secuencia, ControlName como secuencia) como secuencia Dim frm Como Forma Dim CTL como control Dim ctlLabel como control Dim ctlParent como 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 Como Forma Dim ctl como 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

Cuestiones relacionadas