VB.NET Cambio de visibilidad de múltiples etiquetas en tiempo de ejecución

im tratando de conseguir cambiar la visibilidad de diferentes etiquetas durante el tiempo de ejecución después de un botón haga clic

    Dim labelsEmpty As New ArrayList

    Dim allTxt As New List(Of Control)
    For Each txt As TextBox In FindControlRecursive(allTxt, Me, GetType(TextBox))
        If txt.Text = "" Then
            If txt.Name = "TextBox1" Then
            Else
                'Dim textBoxName = txt.Name.ToString.Remove("txt").ToLower
                labelsEmpty.Add(txt.Name.ToString.Replace("txt", "lblMsg"))
            End If
        End If
    Next

    For Each label In labelsEmpty

        Dim Label1 As New Label
        Label1.Name = label
        Label1.Text = "Insert a value"
        Label1.Visible = True

    Next

Esto es lo que tengo, cada buzón de texto en mi forma tiene una etiqueta usada para decirle al usuario que había algún tipo de error, en este caso necesito conseguir qué cuadro de texto queda vacío y establecer la visibilidad de su etiqueta a la verdad (ya oculto de inicio de formulario), así que lo que hago es pasar por cada cuadro de texto en mi forma para ver cuál de los usuarios dejó vacío y luego tomar su nombre (ex: txtAge array) y reemplazarlos

Haciendo así obtengo un array con todos los nombres de etiquetas que deben ser fijados a visible = verdadero

Ahora necesito establecer su visibilidad y valor de texto, así que lo que hice es crear un para cada bucle y conseguir cada etiqueta en el array, pero el código que usé no está funcionando, ya he comprobado si hay elementos en el array y están allí, ¿alguna ayuda? Gracias.

Mi formulario: https://i.stack.imgur.com/qrawz.png

Pregunta hecha hace 3 años, 4 meses, 29 días - Por rubyrover


3 Respuestas:

  • En tu bucle final, estás creando nuevo etiquetas y nunca añadirlas a tu formulario. Si ya tiene etiquetas existentes en su formulario, desea hacer referencia a:

        For Each label In labelsEmpty
    
            With Controls(label)
                .Text = "Insert a value"
                .Visible = True
            End With
    
        Next
    

    La configuración de la propiedad Texto puede ser innecesaria si sus etiquetas ya tienen el texto necesario.

    Si quieres crear nuevas etiquetas y luego agregarlas a tu formulario, necesitas añadir el control al formulario después de que lo hayas creado:

        For Each label In labelsEmpty
    
            Dim Label1 As New Label
            With Label1
                .Name = label
                .Text = "Insert a value"
                '.Top = 100
                '.Left = 100
                .Visible = True
            End With
            Controls.Add(Label1)
    
        Next
    

    Si lo haces de esta manera, necesitarás alguna forma de configurar las propiedades Top e Left para que las etiquetas se ajusten correctamente a tus cuadros de texto existentes. Hay varias maneras de hacer eso, pero te dejaré eso, ya que estoy bastante seguro de que mi primera solución responde a tu pregunta.

    Respondida el Dec 17, 2020 a las 08:30 - por codercentaur

    Votos positivos: 0 | Votos negativos: 0

  • El problema en tu código radica en que estás creando un nuevo objeto Label dentro del bucle For Each, pero no estás agregando este objeto al formulario. Por lo tanto, aunque establezcas la visibilidad del Label, no se reflejará en la interfaz de usuario.

    Para solucionar esto, debes primero agregar el objeto Label creado al formulario utilizando el método Controls.Add. Aquí te dejo un ejemplo de cómo puedes modificar tu código para lograrlo:

    vb
    Dim allLabels As New List(Of Label)
    
    For Each labelName As String In labelsEmpty
        Dim newLabel As New Label
        newLabel.Name = labelName
        newLabel.Text = "Insert a value"
        newLabel.Visible = True
    
        ' Agregar el Label al formulario
        Me.Controls.Add(newLabel)
    
        ' Agregar el Label a la lista para futuras referencias
        allLabels.Add(newLabel)
    Next
    

    Con esta modificación, los Label que se creen en el bucle serán visibles en la interfaz de usuario. Además, se agregan a la lista allLabels, que podrás utilizar posteriormente si necesitas manipular o acceder a estos controles en el futuro.

    Espero que esta solución te sea útil. Si tienes alguna otra pregunta o duda, ¡no dudes en decírmelo!

    Respondida el Dec 18, 2020 a las 08:33 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El código que proporcionaste tiene algunos problemas:

    • Estás creando una nueva etiqueta para cada elemento del array `labelsEmpty` y asignándole el nombre y el texto, pero no estás agregando estas etiquetas al formulario. Esto significa que las etiquetas no serán visibles.
    • Estás intentando establecer la propiedad `Visible` de etiquetas que no existen en el formulario.

    Para solucionar estos problemas, puedes utilizar el siguiente código:

    vb.net
    For Each labelName In labelsEmpty
        Dim label As Label = CType(Me.FindControl(labelName), Label)
        If label IsNot Nothing Then
            label.Visible = True
            label.Text = "Insert a value"
        End If
    Next
    

    Este código recorre el array labelsEmpty, encuentra cada etiqueta en el formulario mediante el método FindControl y establece su propiedad Visible en True y su propiedad Text en "Insert a value".

    Nota: Asegúrate de que las etiquetas que deseas hacer visibles tengan el mismo nombre que los elementos del array labelsEmpty.

    Respondida el Dec 18, 2020 a las 08:36 - por Gemini

    Votos positivos: 0 | Votos negativos: 0