none
Generando dinámicamente TabControls y datagrids en un formulario RRS feed

  • Pregunta

  • Hola buenos días!!
    Tengo una duda sobre cómo acceder a controles creados dinámicamente en tiempo de ejecución. Me explico:
    Tengo un formulario el cual a través de una consulta a una base de datos saca el número de pestañas que debo crear en un tab control, su nombre y si hay datos para volcar, con lo cual voy creándome dinámicamente las pestañas, les asigno un nombre, me creo un datagrid si viene datos, los vuelco en el data grid...
    Hasta aquí todo funciona perfectamente, el problema viene ahora, ya que necesito actualizar los datos de la pestaña activa y claro no se como acceder a ella si se ha creado en tiempo de ejecución.
    ¿¿Alquien tiene alguna idea de como puedo acceder a esta pestaña??
    También se me plantea otro inconveniente. Tengo que acceder a los datos del datagrid, pero si también se ha creado en tiempo de ejecución.... ¿¿cómo puedo hacer referencia a este datagrid, sin sabes la pestaña ??

    Un saludo y muchas gracias de antemano.
    jueves, 4 de marzo de 2010 9:51

Respuestas

  • Buenas!!

    Vamos con algo de recursividad entonces!

    Quedaria asi:
    Añadimos una variable privada a la clase:
    Private GrdActiva As DataGridView = Nothing
    En nuestro metodo de actualizar datos dejamos el código así:
            Dim TabSeleccionada As TabPage = Nothing
            TabSeleccionada = TabMain.SelectedTab
            'Recorremos todos los controles de la Tab, buscamos un TabControl o un Datagrid.
    
            For Each elemento As Control In TabSeleccionada.Controls
                If TypeOf (elemento) Is DataGridView Then
                    'Tenemos nuestro DataGridView!!!!
                    GrdActiva = CType(elemento, DataGridView)
                    Exit For
                ElseIf TypeOf (elemento) Is TabControl Then
                    'Tenemos un TabControl, llamamos a una función recursiva que busca dentro hasta que encuentre una grid!!!
                    BuscaGridRecursivo(elemento)
                    If Not GrdActiva Is Nothing Then
                        Exit For
                    End If
                End If
            Next
    Y creamos nuestra función recursiva que busque en el arbol de controles si estamos en un tabcontrol:
        Private Sub BuscaGridRecursivo(ByVal objeto As Control)
            For Each elemento As Control In objeto.Controls
                If TypeOf (elemento) Is DataGridView Then
                    'Tenemos nuestro DataGridView!!!!
                    GrdActiva = CType(elemento, DataGridView)
                    Exit For
                ElseIf TypeOf (elemento) Is TabControl Or TypeOf (elemento) Is TabPage Then
                    'Tenemos un TabControl, llamamos a una función recursiva que busca dentro hasta que encuentre una grid!!!
                    BuscaGridRecursivo(elemento)
                    If Not GrdActiva Is Nothing Then
                        Exit For
                    End If
                End If
            Next
        End Sub
    Buenas, Espero que de esta forma te funcione!!

    Un gran saludo.
    • Marcado como respuesta akale_82 jueves, 4 de marzo de 2010 10:59
    jueves, 4 de marzo de 2010 10:36
    Moderador

Todas las respuestas

  • Buenos días

    Para acceder a la pestaña activa, tienes que hacerlo por medio del único control que conoces a ciencia cierta: El objeto tabcontrol principal, y desde el intentamos obtener nuestra grid:

            'Definimos un objeto TabPage donde almacenar nuestra tab seleccionada para acceder a sus controles internos.
            Dim TabSeleccionada As TabPage = Nothing
            TabSeleccionada = TabMain.SelectedTab
            'Ahora Si sabemos el nombre de la grid, buscamos dentro de la coleccion controls de la tab, pasamos true al método find
            'para que busque en todos los controles hijos y como devuelve un array, pero sabemos que con ese nombre solo hay una grid
            'seleccionamos el primer elemento:
            Dim GrdActiva As DataGridView = Nothing
            GrdActiva = CType(TabSeleccionada.Controls.Find("", True)(0), DataGridView)
            'Hacemos lo que queramos con la grid.
            GrdActiva.BackgroundColor = Color.Black
    Espero que así te funcione...

    Un saludo!
    jueves, 4 de marzo de 2010 10:03
    Moderador
  • Muchas gracias! 
    es un comienzo, el problema que tengo es que no se el nombre del datagrid, y tampoco se si esta pestaña tiene otro tabcontrol dentro con más pestañas, al generarse dinámicamente no siempre viene lo mismo.

    jueves, 4 de marzo de 2010 10:23
  • Buenas!!

    Vamos con algo de recursividad entonces!

    Quedaria asi:
    Añadimos una variable privada a la clase:
    Private GrdActiva As DataGridView = Nothing
    En nuestro metodo de actualizar datos dejamos el código así:
            Dim TabSeleccionada As TabPage = Nothing
            TabSeleccionada = TabMain.SelectedTab
            'Recorremos todos los controles de la Tab, buscamos un TabControl o un Datagrid.
    
            For Each elemento As Control In TabSeleccionada.Controls
                If TypeOf (elemento) Is DataGridView Then
                    'Tenemos nuestro DataGridView!!!!
                    GrdActiva = CType(elemento, DataGridView)
                    Exit For
                ElseIf TypeOf (elemento) Is TabControl Then
                    'Tenemos un TabControl, llamamos a una función recursiva que busca dentro hasta que encuentre una grid!!!
                    BuscaGridRecursivo(elemento)
                    If Not GrdActiva Is Nothing Then
                        Exit For
                    End If
                End If
            Next
    Y creamos nuestra función recursiva que busque en el arbol de controles si estamos en un tabcontrol:
        Private Sub BuscaGridRecursivo(ByVal objeto As Control)
            For Each elemento As Control In objeto.Controls
                If TypeOf (elemento) Is DataGridView Then
                    'Tenemos nuestro DataGridView!!!!
                    GrdActiva = CType(elemento, DataGridView)
                    Exit For
                ElseIf TypeOf (elemento) Is TabControl Or TypeOf (elemento) Is TabPage Then
                    'Tenemos un TabControl, llamamos a una función recursiva que busca dentro hasta que encuentre una grid!!!
                    BuscaGridRecursivo(elemento)
                    If Not GrdActiva Is Nothing Then
                        Exit For
                    End If
                End If
            Next
        End Sub
    Buenas, Espero que de esta forma te funcione!!

    Un gran saludo.
    • Marcado como respuesta akale_82 jueves, 4 de marzo de 2010 10:59
    jueves, 4 de marzo de 2010 10:36
    Moderador
  • Mil gracias es justo lo que necesitaba.
    jueves, 4 de marzo de 2010 11:00