none
Crear variables durante carga de TreeView en tiempo de ejecución RRS feed

  • Pregunta

  • Buenas Tardes.

    Estoy Llenando un Treeview("tvwEstudios") desde una base de datos SQL, y quiero que al crear los ParentNodes y los CHildNodes, me cree una variable con nombre Temp + (pN, en caso de ser ParentNode, o cN en caso de ChildNode) y el Index del nodo creado.

    Lo que quiero hacer en esas variables, es almacenar el id del Parent o del Child, para que cuando seleccione el nodo en el treeview, me identifique el id y poder hacer una llamada al SQL de vuelta.

    Dejo el código del la carga del treeview, para demostrar donde se crearan y almacenarán las variables.

        Sub LlenaArbol2()
            If CN.State = ConnectionState.Open Then
                CN.Close()
            End If
            Try
                CN.Open()
    
                'DataAdapter de ParentNodeTable
                Dim oDAlocales As New SqlDataAdapter("SELECT id_local,nombre From Tlocales where id_empresa = '" & EmpID & "'", CN)
                'DataTable de ParentNodeTable
                Dim oTlocales As New DataTable("Tlocales")
                Dim oTtecnicos As New DataTable("Ttecnicos")
    
                oDAlocales.Fill(oTlocales)
    
                For Each ParentRow As DataRow In oTlocales.Rows
                    Try
                        Dim pNode As New TreeNode(ParentRow("nombre"))
                        tvwEstudios.Nodes.Add(pNode)
    
                        '-------------------------------------------------
                        'Aqui es donde se creara la variable Temp&pN&pNode.Index
                        'TemppNpNode.Index = ParentRow("id_local")
    
                        'DataAdapter de ChildNodeTable
                        Dim oDAtecnicos As New SqlDataAdapter("SELECT id_local,id_tecnico,nombre From Ttecnicos where id_local = '" & LocID & "' ORDER BY id_tecnico", CN)
                        oDAtecnicos.Fill(oTtecnicos)
                        For Each ChildRow As DataRow In oTtecnicos.Rows
                            Dim cNode As New TreeNode(ChildRow("nombre"))
                            pNode.Nodes.Add(cNode)
    
                            '-------------------------------------------------
                            'Aqui es donde se creara la variable Temp&cN&cNode.Index
                            'TempcNcNode.Index = ChildRow("id_tecnico")
    
                        Next
                    Catch ex As Exception
                        MessageBox.Show(Me, ex.ToString)
                    End Try
                Next
    
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                CN.Close()
            End Try
    
        End Sub

    Espero sus respuestas.

    Gracias.

    miércoles, 20 de febrero de 2019 20:56

Respuestas

  • Saludos Enrique4to

    Puedes ahorrarte lo de la variable y almacenar el dato que necesitas usar dentro de la propiedad Tag del nodo, asi cada vez que seleccione el nodo solo recuperas el dato en el tag del nodo, una opción es usar el selectednode, algo como

    tvwEstudios.SelectedNode.Tag.ToString() ' La propiedad Tag es de tipo object por lo que tendrás que hacer la conversión según necesites

    For Each ParentRow As DataRow In oTlocales.Rows
                    Try
                        Dim pNode As New TreeNode(ParentRow("nombre"))
    
                        pNode.Tag = ParentRow("id_local")
                        tvwEstudios.Nodes.Add(pNode)
    
                        'DataAdapter de ChildNodeTable
                        Dim oDAtecnicos As New SqlDataAdapter("SELECT id_local,id_tecnico,nombre From Ttecnicos where id_local = '" & LocID & "' ORDER BY id_tecnico", CN)
                        oDAtecnicos.Fill(oTtecnicos)
                        For Each ChildRow As DataRow In oTtecnicos.Rows
                            Dim cNode As New TreeNode(ChildRow("nombre"))
    
                            cNode.Tag = ChildRow("id_tecnico")
                            pNode.Nodes.Add(cNode)
    
                        Next
                    Catch ex As Exception
                        MessageBox.Show(Me, ex.ToString)
                    End Try
                Next

    Nos comentas cualquier duda

    • Propuesto como respuesta Pedro AlfaroModerator miércoles, 20 de febrero de 2019 22:04
    • Marcado como respuesta Enrique4to miércoles, 20 de febrero de 2019 22:44
    miércoles, 20 de febrero de 2019 21:37
  • Que tal Yerald...

    Te comento que hice algo similar sólo le agregué aún así un Array para diferenciar entre que tabla va a buscar a la hora de ejecutar el query que necesito con el ID guardado en el tag, y quedó de la siguiente manera.

                For Each ParentRow As DataRow In oTlocales.Rows
                    Try
                        Dim pNode As New TreeNode(ParentRow("nombre"))
                        tvwEstudios.Nodes.Add(pNode)
                        pNode.Tag = ParentRow("id_local")
    
                        'Aquí está el agregado donde el Array toma el nombre con el IDTemp + ID de la local
                        ReDim IDTemp(ParentRow("id_local"))
    
                        'Aquí agregamos el valor entero "0" para saber que es de la tabla Tlocales
                        IDTemp(ParentRow("id_local")) = 0
    
                        Dim oDAtecnicos As New SqlDataAdapter("SELECT id_local,id_tecnico,nombre,apodo From Ttecnicos where id_local = '" & ParentRow("id_local") & "' ORDER BY id_tecnico", CN)
                        Dim oTtecnicos As New DataTable("Ttecnicos")
    
                        oDAtecnicos.Fill(oTtecnicos)
    
                        For Each ChildRow As DataRow In oTtecnicos.Rows
                            Dim cNode As New TreeNode(ChildRow("nombre"))
                            pNode.Nodes.Add(cNode)
                            cNode.Tag = ChildRow("id_tecnico")
    
                            'Aquí está el agregado donde el Array toma el nombre con el IDTemp + ID del técnico
                            ReDim IDTemp(ChildRow("id_tecnico"))
    
                            'Aquí agregamos el valor entero "1" para saber que es de la tabla Tlocales
                            IDTemp(ChildRow("id_tecnico")) = 1
    
                        Next
                    Catch ex As Exception
                        MessageBox.Show(Me, ex.ToString)
                    End Try
                Next
    Muchas gracias en verdad, me ayudó mucho, espero que con esto quede mejor aún.

    • Marcado como respuesta Enrique4to miércoles, 20 de febrero de 2019 22:51
    miércoles, 20 de febrero de 2019 22:51

Todas las respuestas

  • Saludos Enrique4to

    Puedes ahorrarte lo de la variable y almacenar el dato que necesitas usar dentro de la propiedad Tag del nodo, asi cada vez que seleccione el nodo solo recuperas el dato en el tag del nodo, una opción es usar el selectednode, algo como

    tvwEstudios.SelectedNode.Tag.ToString() ' La propiedad Tag es de tipo object por lo que tendrás que hacer la conversión según necesites

    For Each ParentRow As DataRow In oTlocales.Rows
                    Try
                        Dim pNode As New TreeNode(ParentRow("nombre"))
    
                        pNode.Tag = ParentRow("id_local")
                        tvwEstudios.Nodes.Add(pNode)
    
                        'DataAdapter de ChildNodeTable
                        Dim oDAtecnicos As New SqlDataAdapter("SELECT id_local,id_tecnico,nombre From Ttecnicos where id_local = '" & LocID & "' ORDER BY id_tecnico", CN)
                        oDAtecnicos.Fill(oTtecnicos)
                        For Each ChildRow As DataRow In oTtecnicos.Rows
                            Dim cNode As New TreeNode(ChildRow("nombre"))
    
                            cNode.Tag = ChildRow("id_tecnico")
                            pNode.Nodes.Add(cNode)
    
                        Next
                    Catch ex As Exception
                        MessageBox.Show(Me, ex.ToString)
                    End Try
                Next

    Nos comentas cualquier duda

    • Propuesto como respuesta Pedro AlfaroModerator miércoles, 20 de febrero de 2019 22:04
    • Marcado como respuesta Enrique4to miércoles, 20 de febrero de 2019 22:44
    miércoles, 20 de febrero de 2019 21:37
  • Que tal Yerald...

    Te comento que hice algo similar sólo le agregué aún así un Array para diferenciar entre que tabla va a buscar a la hora de ejecutar el query que necesito con el ID guardado en el tag, y quedó de la siguiente manera.

                For Each ParentRow As DataRow In oTlocales.Rows
                    Try
                        Dim pNode As New TreeNode(ParentRow("nombre"))
                        tvwEstudios.Nodes.Add(pNode)
                        pNode.Tag = ParentRow("id_local")
    
                        'Aquí está el agregado donde el Array toma el nombre con el IDTemp + ID de la local
                        ReDim IDTemp(ParentRow("id_local"))
    
                        'Aquí agregamos el valor entero "0" para saber que es de la tabla Tlocales
                        IDTemp(ParentRow("id_local")) = 0
    
                        Dim oDAtecnicos As New SqlDataAdapter("SELECT id_local,id_tecnico,nombre,apodo From Ttecnicos where id_local = '" & ParentRow("id_local") & "' ORDER BY id_tecnico", CN)
                        Dim oTtecnicos As New DataTable("Ttecnicos")
    
                        oDAtecnicos.Fill(oTtecnicos)
    
                        For Each ChildRow As DataRow In oTtecnicos.Rows
                            Dim cNode As New TreeNode(ChildRow("nombre"))
                            pNode.Nodes.Add(cNode)
                            cNode.Tag = ChildRow("id_tecnico")
    
                            'Aquí está el agregado donde el Array toma el nombre con el IDTemp + ID del técnico
                            ReDim IDTemp(ChildRow("id_tecnico"))
    
                            'Aquí agregamos el valor entero "1" para saber que es de la tabla Tlocales
                            IDTemp(ChildRow("id_tecnico")) = 1
    
                        Next
                    Catch ex As Exception
                        MessageBox.Show(Me, ex.ToString)
                    End Try
                Next
    Muchas gracias en verdad, me ayudó mucho, espero que con esto quede mejor aún.

    • Marcado como respuesta Enrique4to miércoles, 20 de febrero de 2019 22:51
    miércoles, 20 de febrero de 2019 22:51