none
Referencia a un control de un grupo de controles RRS feed

  • Pregunta

  • Hola expertos,

    Para controlar que en un grupo de TextBox sólo se escriban números, he creado el siguiente código:

        Private Sub txtDia_Tecla(ByVal sender As Object, ByVal e As KeyPressEventArgs) _

                                    Handles txtDia01.KeyPress, txtDia02.KeyPress, txtDia03.KeyPress, _

                                            txtDia04.KeyPress, txtDia05.KeyPress, txtDia05.KeyPress

            If Tecla0a9c(Asc(e.KeyChar)) = False Then

                e.Handled = False

                CtrlTexto = DirectCast(sender, TextBox)

                DiaLuzNO = CInt(CtrlTexto.Tag)

            Else

                e.Handled = True

            End If

        End Sub

        Friend Function Tecla0a9c(ByVal Pulsado As Integer) As Boolean

            Select Case Pulsado

                Case 8, 13, 44                                  'Borra, Intro, Coma

                    Tecla0a9c = False

                Case 48 To 57                                   'Números 0 a 9

                    Tecla0a9c = False

                Case Else

                    Tecla0a9c = True

                    MessageBox.Show("Sólo admite números del 0 al 9 y una coma para los decimales.", _

                        (ApliNombre & "Calendario"), MessageBoxButtons.OK, MessageBoxIcon.Information)

            End Select

        End Function

    Como se ve, los nombres de los controles (que en el proyecto real son 37, no los 5 que he dejado como ejemplo) están formados por un prefijo igual para todos (txtDia) más un número correlativo. Este número está guardado en la propiedad Tag de cada uno, como si fuera el índice de un array de controles.

    La pregunta es: ¿Puedo referirme directamente a uno de esos controles sin hacer la referencia explícita al nombre completo, sino construyéndolo con la unión del prefijo y un número dado?  Si, por ejemplo, quiero escribir 33 en el control cuyo Tag=03, debería construir el nombre txtDia03 para crear el código: txtDia03.Text=”33”

    Gracias y saludos

    viernes, 11 de noviembre de 2016 16:54

Respuestas

  • Hola Odisea 2001,

    Puedes hacerlo de esta manera.

      Dim valorTag As String = "03"
    
       Dim txt = Me.Controls.OfType(Of TextBox).
                        FirstOrDefault(Function(x) x.Name = String.Concat("txtDia", valorTag))
    
       If txt IsNot Nothing Then  'Si lo encontró
          txt.Text = "33"
       End If

    Aunque si has asignado el Tag a cada uno, y este siempre es un valor diferente podrías buscarlo por ese valor.

     Dim txt = Me.Controls.OfType(Of TextBox).FirstOrDefault(Function(x) CStr(x.Tag) = "03")

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Odisea 2001 viernes, 11 de noviembre de 2016 19:49
    viernes, 11 de noviembre de 2016 17:03

Todas las respuestas

  • Hola Odisea 2001,

    Puedes hacerlo de esta manera.

      Dim valorTag As String = "03"
    
       Dim txt = Me.Controls.OfType(Of TextBox).
                        FirstOrDefault(Function(x) x.Name = String.Concat("txtDia", valorTag))
    
       If txt IsNot Nothing Then  'Si lo encontró
          txt.Text = "33"
       End If

    Aunque si has asignado el Tag a cada uno, y este siempre es un valor diferente podrías buscarlo por ese valor.

     Dim txt = Me.Controls.OfType(Of TextBox).FirstOrDefault(Function(x) CStr(x.Tag) = "03")

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Odisea 2001 viernes, 11 de noviembre de 2016 19:49
    viernes, 11 de noviembre de 2016 17:03
  • Hola Joel

    Aunque me parecen extraordinariamente complicadas, me funcionan igualmente bien cualquiera de las dos soluciones que me envías.

    Muchas gracias por responder. 

    viernes, 11 de noviembre de 2016 19:49