none
Treeview actualizable dinamicamente RRS feed

  • Pregunta

  • Buenos días:

    Partiendo que tengo un treeview que se genera dinamicamente el cuál lo genero de la siguiente forma:

    Private Sub OtroCargarArbol()
            Dim lcsql As String
            Dim dt As DataTable
            Dim mclase As cDatosArbol
            lcsql = "select id,campo1,idpadre from mitabla"
            Using kconexion As System.Data.SqlClient.SqlConnection = Instancia.crearConexion()
                kconexion.Open()
                mclase = New cDatosArbol(kconexion)
                dt = mclase.obtenerDatos(lcsql)
            End Using

            'Prepara la carga del árbol

            arbol.BeginUpdate()
            arbol.Nodes.Clear()
            arbol.ImageList = ListaImagenes

            'Obtiene los nodos de primer nivel
            Dim vwRaiz As New DataView(dt, "idpadre=0", "id", DataViewRowState.CurrentRows)
            Dim mNodo As TreeNode
            lc_colores = 0

            For Each rv As DataRowView In vwRaiz
                'Crea cada nodo de primer nivel
                mNodo = arbol.Nodes.Add(rv.Item("id"), rv.Item("campo1"))
                mNodo.Tag = rv.Item("id")
                mNodo.ToolTipText = rv.Item("campo1")
                If lc_iteracion > 3 Then lc_iteracion = 0
                mNodo.ImageIndex = lc_iteracion
                mNodo.SelectedImageIndex = lc_iteracion
                mNodo.BackColor = ColorTranslator.FromHtml(cInicio.Colores.DeepSkyBlue)
                mNodo.NodeFont = DimeFuente(0, cInicio.TamanoLetra.Letra9)
                lc_iteracion += 1
                'Carga los nodos dependientes de éste
                OtroCargarNodo(mNodo)

            Next

            'Finaliza la carga del árbol
            arbol.EndUpdate()
            arbol.ExpandAll()


        End Sub


        Private Sub OtroCargarNodo(ByRef NodoPadre As TreeNode)
            Dim lcsql As String
            Dim dt As DataTable
            lcsql = "select id,campo1,idpadre from mitabla"
            Using kconexion As System.Data.SqlClient.SqlConnection = Instancia.crearConexion()
                kconexion.Open()
                mclase = New cDatosArbol(kconexion)
                dt = mclase.obtenerDatos(lcsql)
            End Using

            'Obtiene los nodos dependientes de NodoPadre
            Dim vw As New DataView(dt, "idpadre='" & NodoPadre.Tag & "'", "campo1", DataViewRowState.CurrentRows)
            Dim mNodo As TreeNode

            'Por cada nodo encontrado...
            For Each rv As DataRowView In vw
                'Agrega el nodo encontrado al NodoPadre
                mNodo = NodoPadre.Nodes.Add(rv.Item("id"), rv.Item("campo1"))
                mNodo.Tag = rv.Item("id")
                mNodo.ToolTipText = rv.Item("campo1")
                If lc_iteracion > 3 Then lc_iteracion = 0
                mNodo.ImageIndex = lc_iteracion
                mNodo.SelectedImageIndex = lc_iteracion
                mNodo.BackColor = DimeColor(lc_colores)
                mNodo.NodeFont = DimeFuente(lc_iteracion, cInicio.TamanoLetra.Letra8)
                lc_iteracion += 1
                lc_colores += 1
                If lc_colores > 4 Then lc_colores = 0
                'Busca los nodos dependientes de éste
                OtroCargarNodo(mNodo)
            Next

        End Sub

    Necesito realizar lo siguiente:

    Cada cierto tiempo actualizar dicho treeview con las siguientes particularidades:

    Poder comparar el arbol actual con el nuevo, incluyendo las modificaciones añadiendo los nuevos nodos de la forma más optima posible. Si un nodo está expandido se debe de dejar igual y el usuario no debe de notar nada, es decir que no se debe de desplazar del nodo actual que tuviera seleccionado.

    Gracias,

    • Cambiado Enrique M. Montejo miércoles, 15 de febrero de 2017 17:04 Pregunta relacionada con controles de Windows Forms.
    martes, 14 de febrero de 2017 8:17

Todas las respuestas

  • Buenos días:

    Tengo que actualizar un treeview cada cierto tiempo y he puesto un timer pero cuando ejecuta el evento Elapsed me da el siguiente error:

    Error: Operacion no válida a traves de subprocesos: Se tuvo acceso al control 'arbol' desde un subproceso distinto a aquel en que lo creó

    ¿A que se debe eso?

    martes, 14 de febrero de 2017 8:58