none
Hacer referencia a un control cuyo nombre lo tengo en un string RRS feed

  • Pregunta

  • Hola gente! tengo una dudilla. Haber si me podeis ayudar.
    La cuestion es que tengo un control por ejemplo un textbox que se llama txtNombre
    en una variable de tipo estring guardo el txtNombre. Como puede hacer referencia a sus propiedeades y sus metodos desde la variable?
    Me gusataria saber hacerlo de coste uno, no recorriendo todos los controles.

    ejemplo
    dim str as string= txtNombre
    txtnombre.visible=false

    str.........visble=true

    No se si me explico

    Gracias de antemano
    miércoles, 22 de julio de 2009 13:28

Respuestas

  • > la verdad es que no me ha solucionado el problema.
    > lo que yo pregunto es:
    > dim str as string="txtNombre"
    >
    > y por ejemplo acceder a las  propiedades de este control

    Entiendo perfectamente lo que deseas hacer, pero vuelvo a insistirte de que ello NO ES POSIBLE.

       Dim str As String="txtNombre"

    Ahí lo que tienes es una VARIABLE ALFANUMÉRICA, cuyo valor es "txtNombre", y podrás acceder a las propiedades y métodos de la clase String, pero no a las propiedades y métodos de un objeto TextBox o de un objeto Button, porque la variable str sólo entiende de valores alfanuméricos. ¿Comprendes?

    > lo que quiero evitar es tener que recorrer todos los
    > controles del formulario y ver que coincida con el texto.

    ¿Y eso es tan complicado de realizar? ¿No puedes definir una función genérica que haga ese trabajo?

      Private Function GetReference(ByVal nombreControl As String) As Control

            ' Recorremos la colección de controles del formulario
            '
            For Each ctrl As Control In Me.Controls

                If ctrl.Name.ToLower = nombreControl.ToLower Then
                    ' Devolvemos la referencia y abandonamos la función
                    Return ctrl
                End If

            Next

            Return Nothing

        End Function

    Ahora, referenciarías a un control por su nombre de la siguiente manera:

            ' Referenciamos el control TextBox
            '
            Dim tb As TextBox = DirectCast(GetReference("txtNombre"), TextBox)

            ' Accedemos a sus propiedades
            '
            If tb IsNot Nothing Then
                tb.Visible = Not tb.Visible
            End If

    Insisto. Para acceder a las propiedades y métodos de un objeto concreto, tienes que declarar una variable con el mismo tipo de dato. ¿Que es un TextBox? La variable será del tipo TextBox. ¿Qué es un objeto Button? La variable será del tipo Button.

    P.D.: Si la respuesta resuelve tu problema, no te olvides de marcarla como satisfactoria. ¿OK?


    Enrique Martínez [MS MVP - VB]
    miércoles, 22 de julio de 2009 14:53
    Moderador
  • :-)
    Hola,

    Vas bien encaminado, el segundo parámetro del método FIND indica si quieremos buscar en todos los hijos. Te paso un ejemplo:

            If Me.Controls.Find("Button1", True).Count = 1 Then
                Dim b As Button = Me.Controls.Find("Button1", True)(0)
                b.Text = "Hello!"
            End If
    Saludos,

    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    • Marcado como respuesta Pradexxible miércoles, 22 de julio de 2009 15:30
    miércoles, 22 de julio de 2009 14:58
    Moderador

Todas las respuestas

  • Hola:

    Si la variable objeto txtNombre hace referencia a un control TextBox, la siguiente asignación no está permitida:

         Dim str As String = txtNombre

    Porque un valor TextBox no se puede convertir a String.

    Para guardar la referencia del control TextBox, tienes que declarar una variable del tipo TextBox:

         Dim tb As TextBox = txtNombre

         tb.Visible = Not tb.Visible

    Un saludo


    Enrique Martínez [MS MVP - VB]
    miércoles, 22 de julio de 2009 13:35
    Moderador
  • Gracias por la repuesta no me explicado bien. Ademas de comente un error en el codigo
    dim str as string ="txtNombre"

    Mi pregunta es si puedo acceder a las propiedades de txtNombre a partir de str


    Gracias de nuevo por contestar


    miércoles, 22 de julio de 2009 13:47
  • "Pradexxible" preguntó:

    > Mi pregunta es si puedo acceder a las propiedades de txtNombre a partir de str

    No, porque en la variable str simplemente tendrás una cadena llamada "txtNombre"

    Para acceder a las propiedades del control, tienes que hacer lo que te he comentado anteriormente:

         ' Referenciamos el control
         '
         Dim tb As TextBox = txtNombre

         ' Accedemos a sus propiedades
         '
         tb.Visible = Not tb.Visible

    P.D.: Si la respuesta resuelve tu problema, no te olvides de marcarla como satisfactoria. ¿OK?
    Enrique Martínez [MS MVP - VB]
    miércoles, 22 de julio de 2009 14:08
    Moderador
  • Estoy agradecido de que contestes pero la verdad es que no me ha solucionado el problema.
    lo que yo pregunto es:
    dim str as string="txtNombre"

    y por ejemplo acceder a las  propiedades de este control por ejemplo

    frmClientes.contrlos(str).visible=false 'este ejemplo no funciona porque la controls a su vez tiene otros controls y asi succecivamente, es un arbol.

    lo que quiero evitar es tener que recorrer todos los controles del formulario y ver que coincida con el texto.

    Muchisimas gracias





    miércoles, 22 de julio de 2009 14:24
  • > la verdad es que no me ha solucionado el problema.
    > lo que yo pregunto es:
    > dim str as string="txtNombre"
    >
    > y por ejemplo acceder a las  propiedades de este control

    Entiendo perfectamente lo que deseas hacer, pero vuelvo a insistirte de que ello NO ES POSIBLE.

       Dim str As String="txtNombre"

    Ahí lo que tienes es una VARIABLE ALFANUMÉRICA, cuyo valor es "txtNombre", y podrás acceder a las propiedades y métodos de la clase String, pero no a las propiedades y métodos de un objeto TextBox o de un objeto Button, porque la variable str sólo entiende de valores alfanuméricos. ¿Comprendes?

    > lo que quiero evitar es tener que recorrer todos los
    > controles del formulario y ver que coincida con el texto.

    ¿Y eso es tan complicado de realizar? ¿No puedes definir una función genérica que haga ese trabajo?

      Private Function GetReference(ByVal nombreControl As String) As Control

            ' Recorremos la colección de controles del formulario
            '
            For Each ctrl As Control In Me.Controls

                If ctrl.Name.ToLower = nombreControl.ToLower Then
                    ' Devolvemos la referencia y abandonamos la función
                    Return ctrl
                End If

            Next

            Return Nothing

        End Function

    Ahora, referenciarías a un control por su nombre de la siguiente manera:

            ' Referenciamos el control TextBox
            '
            Dim tb As TextBox = DirectCast(GetReference("txtNombre"), TextBox)

            ' Accedemos a sus propiedades
            '
            If tb IsNot Nothing Then
                tb.Visible = Not tb.Visible
            End If

    Insisto. Para acceder a las propiedades y métodos de un objeto concreto, tienes que declarar una variable con el mismo tipo de dato. ¿Que es un TextBox? La variable será del tipo TextBox. ¿Qué es un objeto Button? La variable será del tipo Button.

    P.D.: Si la respuesta resuelve tu problema, no te olvides de marcarla como satisfactoria. ¿OK?


    Enrique Martínez [MS MVP - VB]
    miércoles, 22 de julio de 2009 14:53
    Moderador
  • :-)
    Hola,

    Vas bien encaminado, el segundo parámetro del método FIND indica si quieremos buscar en todos los hijos. Te paso un ejemplo:

            If Me.Controls.Find("Button1", True).Count = 1 Then
                Dim b As Button = Me.Controls.Find("Button1", True)(0)
                b.Text = "Hello!"
            End If
    Saludos,

    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    • Marcado como respuesta Pradexxible miércoles, 22 de julio de 2009 15:30
    miércoles, 22 de julio de 2009 14:58
    Moderador
  • Ahora que lo comentas, efectivamente, también puede utilizar el método Find para buscar un control:

        Private Function GetReference(ByVal nombreControl As String) As Control

            Dim ctrl() As Control = Me.Controls.Find(nombreControl, True)

            If ctrl.Length = 0 Then
                Return Nothing
            Else
                Return ctrl(0)
            End If

        End Function

    Un saludo, Lluis


    Enrique Martínez [MS MVP - VB]
    miércoles, 22 de julio de 2009 15:11
    Moderador
  • Muchas gracias a los dos.

    a SoftJaen: No me cuesta nada hacer una funcion que recorra controles, lo que pasa es que queria evitar justamente eso. Si por cada control que quiero desactivar tengo que recorrelos todos me se dispara el coste que pretendo obtener.

    a Lluis Franco Muchas Gracias por la respuesta, se ajusta mas a lo que andaba buscando aunque creo que el coste continuara siendo n en el peor de los caso. De todas formas utilizare tu codigo.

    Me preguntaba si habia alguna funcion de coste 1 o al menos logaritmica. Porque lo utilizo para comprobar si el usuario puede ver o no el control( o controles) cuando entra en el form. Y ademas cargo un grid. y no quiero que tarde mucho

    Aunque tambien había pensado que si se puede cargar el grid de forma asincrona y asi mientras va recuperando datos poder hacer yo estas comprobaciones. Pero utilizo el metodo fill del asistente y no se muy bien si lo que digo puede hacerse. Investigare un poco mas a ver si consigo hacer que funcione de forma mas o menos eficiente.

    Insisto en que me habeis ayudado mucho los dos.  Gracias
    miércoles, 22 de julio de 2009 15:29
  • "Pradexxible" escribió:

    > a SoftJaen: No me cuesta nada hacer una funcion que recorra controles,
    > lo que pasa es que queria evitar justamente eso. Si por cada control que
    > quiero desactivar tengo que recorrelos todos me se dispara el coste que
    > pretendo obtener.
    >
    > a Lluis Franco Muchas Gracias por la respuesta, se ajusta mas a lo que
    > andaba buscando aunque creo que el coste continuara siendo n en el
    > peor de los caso. De todas formas utilizare tu codigo.

    Pues no me extrañaría a mí que el método Find recorra todos los controles del formulario para encontrar aquel que coincida con el nombre especificado.

    No hay nada malo en recorrer la colección Controls, porque el tiempo que se tarda en hacerlo, es inapreciable, por muchos controles que haya insertados en el formulario. :-)

    Para las nuevas preguntas que efectúas, mejor será que las hagas en una nueva conversación, si así lo crees conveniente, claro está.


    Enrique Martínez [MS MVP - VB]
    miércoles, 22 de julio de 2009 15:39
    Moderador
  • Si lo doy por zanjado me habeis ayudado mucho.
    Si tengo otra consulta ya abrire otro hilo.


    de nuevo gracias a los dos
    miércoles, 22 de julio de 2009 16:08
  • Hola,

    Vas bien encaminado, el segundo parámetro del método FIND indica si quieremos buscar en todos los hijos. Te paso un ejemplo:

            If Me.Controls.Find("Button1", True).Count = 1 Then
                Dim b As Button = Me.Controls.Find("Button1", True)(0)
                b.Text = "Hello!"
            End If
    
    Saludos,

    Como dice Lluis Franco, es efectiva esta solución, me ha servido, puesto que restrinjo los controles de la aplicación según perfiles de usuario, entonces en una tabla de la BD almaceno el nombre del formulario que contiene el control, el nombre del control y el @ID del perfil de los usuarios, entonces con este método y un datareader puedo hacer una aplicación más "dinámica" en el sentido que pueden existir infinidad de perfiles con accesos a los distintos controles de la aplicación.

    Gracias por la ayuda!.

    viernes, 23 de agosto de 2013 9:15
  • Hola; si se puede hacer, pero tienes que saber cual es su contenedor, por ejemplo si se encuentra en el Form1, sería de esta manera:

    Dim Caja_Texto As TextBox
    
    Caja_Texto = Form1.Controls("TextBox1")

    Y listo, TextBox1 lo puedes reemplazar con tu variable String donde tienes el nombre del control que quieres encontrar.

    Saludos.

    sábado, 10 de diciembre de 2016 0:56
  • Excelente ejemplo.. a mí me sirvió muy bien.. Gracias
    viernes, 1 de febrero de 2019 1:38