none
Directcast(FindControl en el directorio App_Code no funciona.

    Pregunta

  • Hola a todos,

                         Tengo para variar un problemón, tengo muchas páginas que tienen la misma función que trae los datos de la página .aspx con:

    Dim opera As String = DirectCast(FindControl("RSol"), RadioButton).Checked

    Entonces se me ocurrió, colocar todas esas funciones en un espacio de nombres adentro de la carpeta App_Data (ahorrando las 20 repeticiones de esa función que es un poco grande en todas esas páginas).

    Problema en App_Data:

    Public Shared Sub BindBusqueda(ByVal LVClear As ListView, ByVal LV As ListView .....

    ......

    Dim opera As String = DirectCast(FindControl("RSol"), RadioButton).Checked

    .....

    End Sub

    Todo funciona menos el FindControl que dice el siguiente error: "No se puede hacer referencia a un miembro de instancia de una clase desde un método compartido o un inicializador de método compartido sin una instancia explícita de la clase."

    ¿Cómo puede obtener datos de un control de una página .aspx cualquiera, desde una clase .vb (adentro de App_Data)?


    Roberto


    • Editado Razeus miércoles, 06 de febrero de 2013 18:58 update error
    miércoles, 06 de febrero de 2013 18:10

Respuestas

  • Estimado Razeus

    No es posible obtener "directamente" un control con FindControl desde una clase "separada de la pagina" porque desde la misma no se tiene "conocimiento" de los controles
    Salvo que puedas tener algun mecanismo para que desde la clase se "conozca" los controles que estan dentro de la pagina/usercontrol

    1. Podrias implementar algun mecanimos de herencia para que todas que necesiten hereden de esta clase "PaginaBase" 
      Pero seria muy "acoplado" y demasiado rebuscado para mi gusto
    2. Podrias pasarle como parametro la pagina (el control contenedor) 
      Esto es lo que hace FindControl del codigo que propones

    En la opcion 2 has algo asi

    Public Shared Sub BindBusqueda(ByRef pagina As Page, ByVal LVClear As ListView, ByVal LV As ListView ...

    Entonces puedes hacer

    Dim opera As String = DirectCast(pagina.FindControl("RSol"), RadioButton).Checked

    O como encontraste el codigo puede pasar el tipo Control (System.Web.UI.Control) asi es mas generico

    Public Shared Sub BindBusqueda(ByRef controlContenedor As System.Web.UI.Control, ByVal LVClear As ListView, ByVal LV As ListView ..
    y asi seria controlContenedor.FindControl()


    Espero que te sirva de ayuda o guia


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja

    • Marcado como respuesta Razeus jueves, 07 de febrero de 2013 3:08
    miércoles, 06 de febrero de 2013 23:37

Todas las respuestas

  • pero el Checked devuelve un boolean, poque lo asignas a un string ?

    Dim opera As Boolean= DirectCast(FindControl("RSol"), RadioButton).Checked

    ese FindControl() aplcia sobre la pagina o sobre un control ? o sea seria

    Me.FindControl() porque eso es lo que estas haciendo

    ntonces se me ocurrió, colocar todas esas funciones en un espacio de nombres adentro de la carpeta App_Data

    no sera en App_Code ?

    esa carpeta es para poner la base de datos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    miércoles, 06 de febrero de 2013 18:22
  • Hola Leandro,

                        Tomo el string (TRUE o FALSE) del checked en vez del Boolean. El FindControl aplica sobre un control que está en todas las páginas.

    Tengo 20 páginas .aspx con un control Checked llamado "RSol"; y para esas 20 páginas tengo 1-a-20.vb con el código donde una función me trae sin problemas el valor del Checked con FindControl; el problema empezó al transferir el código de esas 20 páginas adentro de la carpeta App_Code (me equivoque al escribirlo antes).

    En App_Code tengo:

    algo.vb

    Namespace resultados

    Public Class test1

    Public Shared Sub BindBusqueda(ByVal LVClear As ListView, ByVal LV As ListView .....

    ......

    Dim opera As String = DirectCast(FindControl("RSol"), RadioButton).Checked

    .....

    End Sub

    End Class

    End Namespace

    Error: FindControl es un tipo y no se puede usar como una expresión. O si le agrego esto que vi por la web:

       Public Function FindControl(ByVal ControlName As String, ByVal CurrentControl As Control) As Control
                Dim ctr As Control
                For Each ctr In CurrentControl.Controls
                    If ctr.ID = ControlName Then
                        Return ctr
                    Else
                        ctr = FindControl(ControlName, ctr)
                        If Not ctr Is Nothing Then
                            Return ctr
                        End If
                    End If
                Next ctr
            End Function

    Error: "No se puede hacer referencia a un miembro de instancia de una clase desde un método compartido o un inicializador de método compartido sin una instancia explícita de la clase."

    Cualquier ayuda es más que agradecida!


    Roberto

    miércoles, 06 de febrero de 2013 18:38
  • El FindControl aplica sobre un control que está en todas las páginas.

    el findcontrol aplcia al contexto donde se esta eejcutando, si usaste algun codigo base y navegas por la pagina1.aspx entonces hara el FindControl en esa pagina

    pero si depsues navegas por la pagina15.apx entonces buscara en esta otra, pero no es que lo hara por todas a las vez

    el problema empezó al transferir el código de esas 20 páginas adentro de la carpeta App_Code (me equivoque al escribirlo antes).

    porque no cambias de tipo de proyecto, no uses un web site, usa un web application

    este compila a una dll el codigo con lo cual evitaras miles de problemas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 06 de febrero de 2013 18:44
  • Lo cambie a Web Application, pero me da los mismos errores. Pregunto, ¿Es posible obtener desde una clase el valor de un control con Directcast(FindControl("Nombre"),Texbox) ?

    Por lo que ví, si es posible, pero requiere algún tratamiento especial o muy complejo?


    Roberto

    miércoles, 06 de febrero de 2013 19:22
  • Estimado Razeus

    No es posible obtener "directamente" un control con FindControl desde una clase "separada de la pagina" porque desde la misma no se tiene "conocimiento" de los controles
    Salvo que puedas tener algun mecanismo para que desde la clase se "conozca" los controles que estan dentro de la pagina/usercontrol

    1. Podrias implementar algun mecanimos de herencia para que todas que necesiten hereden de esta clase "PaginaBase" 
      Pero seria muy "acoplado" y demasiado rebuscado para mi gusto
    2. Podrias pasarle como parametro la pagina (el control contenedor) 
      Esto es lo que hace FindControl del codigo que propones

    En la opcion 2 has algo asi

    Public Shared Sub BindBusqueda(ByRef pagina As Page, ByVal LVClear As ListView, ByVal LV As ListView ...

    Entonces puedes hacer

    Dim opera As String = DirectCast(pagina.FindControl("RSol"), RadioButton).Checked

    O como encontraste el codigo puede pasar el tipo Control (System.Web.UI.Control) asi es mas generico

    Public Shared Sub BindBusqueda(ByRef controlContenedor As System.Web.UI.Control, ByVal LVClear As ListView, ByVal LV As ListView ..
    y asi seria controlContenedor.FindControl()


    Espero que te sirva de ayuda o guia


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja

    • Marcado como respuesta Razeus jueves, 07 de febrero de 2013 3:08
    miércoles, 06 de febrero de 2013 23:37
  • Estimado José,

                        Esa es la idea, y de hecho estoy con un buen rumbo con tus ideas. Gracias realmente!!!

    En el caso de BindBusqueda(Pagina as Page, ... ) Funciona de maravilla cuando le coloco BindBusqueda(Me.Page, ...) como variable en la función.

    También se me ocurrió de último momento (ByRef controlContenedor, ...  y funciona colocar directamente (ByRef DirectCast(FindControl("RSol"), RadioButton).Checked.ToString, ... y después tomo el True o el False y lo puedo manejar. Que también fue mencionado por ti.

    Gracias Maestro!


    Roberto

    jueves, 07 de febrero de 2013 3:08