elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Control TreeView
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Control TreeView  (Leído 16,729 veces)
elmaro


Desconectado Desconectado

Mensajes: 301


Unas simples palabras...


Ver Perfil
Control TreeView
« en: 30 Octubre 2007, 16:47 pm »

que tal?
Bueno paso a comentarles mi inquietud. No tuve problemas al usar un control TreeView en vb6, pero cuando migre a .NET se me dificulto la cosa. No puedo agregar lo que yo quiero como yo quiero.
Pongo un code de ejemplo:


Código:
       
treeview.Nodes.Add("Raiz")

treeview.Nodes(0).Nodes.Add("Primero")
treeview.Nodes(0).Nodes.Add("Segundo")
treeview.Nodes(0).Nodes.Add("Tercero")

con ese code creo una raiz y colgando de esa raiz los items Primero, Segundo y Tercero.
Ahora... yo quiero colgar items del item "Primero" y eso es lo que no puedo hacer

Saludos.


En línea

Hadess_inf
Desesperado
Colaborador
***
Desconectado Desconectado

Mensajes: 2.048


Nueva Vida


Ver Perfil WWW
Re: Control TreeView
« Respuesta #1 en: 30 Octubre 2007, 22:57 pm »


Citar
TreeView1.Nodes.Add("Raiz 1")
TreeView1.Nodes(0).Nodes.Add("Primero R1")
TreeView1.Nodes(0).Nodes.Add("Segundo R1")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Sub Primero 1")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Sub Primero 2")
TreeView1.Nodes(0).Nodes(1).Nodes.Add("Sub segundo 1")
TreeView1.Nodes(0).Nodes(1).Nodes.Add("Sub segundo 2")


En línea

elmaro


Desconectado Desconectado

Mensajes: 301


Unas simples palabras...


Ver Perfil
Re: Control TreeView
« Respuesta #2 en: 31 Octubre 2007, 21:40 pm »

si, esta perfecto eso, ya me habia dado cuenta
muchas gracias :)

el problema mio ahora es el siguiente
es urgente, necesito hacer este arbol mañana :S

el arbol lo tengo q hacer en base a una tabla sql

con los sig campos "CODIGO(string)" "DESCRPCION(string)" "PADRE(string)"

el tema es que no puedo hacerlo :S encontre un code en google q parece andar pero no me anda tiene un problema


suponiendo que el arbol no tiene mas de 6 niveles
por favor si alguien sabe como hacer esto q me ayude
es bastante muy distinto a vb6 :S

un saludo grande a todso y gracais por la colaboracion
En línea

Hadess_inf
Desesperado
Colaborador
***
Desconectado Desconectado

Mensajes: 2.048


Nueva Vida


Ver Perfil WWW
Re: Control TreeView
« Respuesta #3 en: 1 Noviembre 2007, 00:15 am »

NO entiendo que quieres decir...quieres llenar los datos de una table en un treeview?. En el caso que asi sea, que dato es el que deseas mostrar ( CODIGO - DESCRIPCION - PADRE ). En el caso que quieras mostrar los datos de esa tabla el control solo tendria un nivel:


Citar
dim con as new sqlconnection(".....")
dim da as sqldataadapter
dim dtb as data.datatable

sub Form_Load(byval.........)
da= new sqldataadapter("select * from tabla",con)
dtb = new data.datatable
da.fill(dtb)
dim a as integer
for a=0 to dtb.rows.count-1
treeview1.nodes.add dtb.rows(a)("COLUMNA").tostring
end for
end sub
En línea

elmaro


Desconectado Desconectado

Mensajes: 301


Unas simples palabras...


Ver Perfil
Re: Control TreeView
« Respuesta #4 en: 1 Noviembre 2007, 00:39 am »

te explico a lo que me refiero, es que escribi apurado porque me estaba llendo.

una parte de la tabla supongamos es asi:

CODIGO       DESCRIPCION        PADRE
001             Item 1       (en blanco)
002             Item 2           001
003             Item 3           001
004             Item 4           001
005             Item 5           002
006             item 6           002
007             Item 7           005
008             Item 8           005
009             Item 9           005
010             Item 10          006



el arbol quedaria de la siguiente manera:


Código:
Item 1
   |____Item 2
   |      |____Item 5
   |      |      |___Item 7
   |      |      |___Item 8
   |      |      |___Item 9
   |      |
   |      |____Item 6
   |             |___Item 10
   |
   |____Item 3
   |____Item 4 

creo que quedo claro, el dato que se muestra es la descripcion.
hace un rato estaba pensando en agregar los controles de vb6 a vb.net y usar la funcion que hize hace un tiempo para el mismo fin. pero tambien quiero saber como hacerlo directamente desde los controles de vb.net.

muchas gracias por las respeustas.

Saludos.
En línea

Hadess_inf
Desesperado
Colaborador
***
Desconectado Desconectado

Mensajes: 2.048


Nueva Vida


Ver Perfil WWW
Re: Control TreeView
« Respuesta #5 en: 1 Noviembre 2007, 01:43 am »

Recursividad ¿?
Sabras que es eso, supongo.
En línea

elmaro


Desconectado Desconectado

Mensajes: 301


Unas simples palabras...


Ver Perfil
Re: Control TreeView
« Respuesta #6 en: 1 Noviembre 2007, 03:05 am »

exacto, si se que es la recursividad. la funcion que hize en vb6 era recursiva, pero como en .net hay variaciones en el codigo todadvia no pude hacer una funcion semejante, ni usando la anterior como "base", hace 3 dia utilizo .net.

es posible hacer un llenado recursivo? sin limitacion? como la que hize en vb6 ya que la unica q encontre tenia un limite, si querias mas niveles habria que agregar codigo y era cada vez mas por cada agregado, pero no funcionaba

es posible?con o sin limitacion.

Saludos nuevamente
En línea

Hadess_inf
Desesperado
Colaborador
***
Desconectado Desconectado

Mensajes: 2.048


Nueva Vida


Ver Perfil WWW
Re: Control TreeView
« Respuesta #7 en: 1 Noviembre 2007, 05:07 am »

En SQL

Citar
Create database Ejemplo
go
use ejemplo
go

create table rutina
(codigo char(3) primary key,
descripcion varchar(7),
padre char(3))
go

insert into rutina values ('001','Item 1','')
insert into rutina values ('002','Item 2','001')
insert into rutina values ('003','Item 3','001')
insert into rutina values ('004','Item 4','001')
insert into rutina values ('005','Item 5','002')
insert into rutina values ('006,'Item 6','002')
insert into rutina values ('007','Item 7','005')
insert into rutina values ('008','Item 8','005')
insert into rutina values ('009','Item 9','005')
insert into rutina values ('010','Item 10','006')

En .NET

Crea un nuevo proyecto, 1 formulario(Form1) y un control treeview(treeview1)

Citar
Imports System.Data.SqlClient
Public Class Form1
    Dim con As New SqlConnection("integrated security=sspi;data source=(local);initial catalog=ejemplo")
    Dim da As SqlDataAdapter
    Dim dtb As DataTable
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        da = New SqlDataAdapter("select * from rutina", con)
        dtb = New DataTable
        da.Fill(dtb)
        Dim a As Integer
        For a = 0 To dtb.Rows.Count - 1
            If dtb.Rows(a)("padre").ToString = "   " Then
                TreeView1.Nodes.Add(dtb.Rows(a)("descripcion").ToString)
                añade(dtb.Rows(a)("codigo").ToString, TreeView1.Nodes(TreeView1.Nodes.Count - 1))
            End If
        Next
    End Sub
    'Añade, funcion recursiva
    Sub añade(ByVal cod As String, ByVal node As TreeNode)
        da = New SqlDataAdapter("select * from rutina", con)
        dtb = New DataTable
        da.Fill(dtb)
        'variable que recorre las filas de la tabla
        Dim a As Integer
        For a = 0 To dtb.Rows.Count - 1
            If dtb.Rows(a)("padre").ToString = cod Then
                node.Nodes.Add(dtb.Rows(a)("descripcion").ToString)
                añade(dtb.Rows(a)("codigo").ToString, node.Nodes(node.Nodes.Count - 1))
            End If
        Next
    End Sub
End Class

Espero sea util, mas demore poniendole color ....  :xD :xD :xD :xD :xD
Necesito explicar ¿?   :rolleyes: :rolleyes: :rolleyes:
« Última modificación: 1 Noviembre 2007, 17:57 pm por hadess_inf » En línea

elmaro


Desconectado Desconectado

Mensajes: 301


Unas simples palabras...


Ver Perfil
Re: Control TreeView
« Respuesta #8 en: 1 Noviembre 2007, 21:22 pm »

muchisimas gracias por tu tiempo
explico nuevamente mi situacion, cada vez mas oscura jaja

utilize tu code pero despues de algun que otro retoque(por ejemplo la forma en que me conecto.) es como que nunca llega a su fin la ejecucion, no se porque sera, no se si sera la funcion o porq estoy procesando 7 mil registros.
dejo el codigo "modificado" para mirar y analizar.

En un modulo:
Código:
    Public ex As Exception 'variable que guardará una exepcion (error)
    Public MyConexion As New OleDb.OleDbConnection() 'objeto de ADO.net para conectar con la BD
    Public MiAdaptador As New OleDb.OleDbDataAdapter 'adaptador de datos
    Public dsDataSet As New Data.DataSet() ' objeto que guardará los resultados de la consulta
    Public strSQL As String 'para crear la consulta SQL

En el load del formulario(el formulario se llama frm_dimproducto)
Código:
Private Sub frm_dimproducto_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        strSQL = "SELECT * FROM DimTempCustomer"
        MiAdaptador = New OleDb.OleDbDataAdapter(strSQL, MyConexion.ConnectionString)
        MiAdaptador.Fill(dsDataSet, "MiTabla")

        Dim a As Integer
        Dim Codigo, Descripcion, Padre As String

        For a = 0 To dsDataSet.Tables("MiTabla").Rows.Count - 1
            Codigo = Trim(dsDataSet.Tables("MiTabla").Rows(a).Item("DimT_Codigo"))
            Descripcion = Trim(dsDataSet.Tables("MiTabla").Rows(a).Item("DimT_Descripcion"))
            Padre = Trim(dsDataSet.Tables("MiTabla").Rows(a).Item("DimT_Padre"))

            If Padre = "" Then
                TreeView1.Nodes.Add(Descripcion)
                añade(Codigo, TreeView1.Nodes(TreeView1.Nodes.Count - 1))
            End If
            Application.DoEvents()
        Next
    End Sub

En el sub añade:
Código:
Sub añade(ByVal cod As String, ByVal node As TreeNode)
        strSQL = "SELECT * FROM DimTempCustomer"
        MiAdaptador = New OleDb.OleDbDataAdapter(strSQL, MyConexion.ConnectionString)
        MiAdaptador.Fill(dsDataSet, "MiTabla2")

        'variable que recorre las filas de la tabla
        Dim a As Integer
        Dim Codigo, Descripcion, Padre As String

        For a = 0 To dsDataSet.Tables("MiTabla").Rows.Count - 1
            Codigo = Trim(dsDataSet.Tables("MiTabla2").Rows(a).Item("DimT_Codigo"))
            Descripcion = Trim(dsDataSet.Tables("MiTabla2").Rows(a).Item("DimT_Descripcion"))
            Padre = Trim(dsDataSet.Tables("MiTabla2").Rows(a).Item("DimT_Padre"))

            If Padre = cod Then
                node.Nodes.Add(Descripcion)
                añade(Codigo, node.Nodes(node.Nodes.Count - 1))
            End If
            Application.DoEvents()
        Next
    End Sub
yo quisiera creer que es por un tema del dataset, repito que mi experiencia con .net es de solo 1 semana.


tambien dejo el codigo de la funcion que realize en vb6 con el treeview perteneciente a los controles com, el cual no funciona por razones que desconozco, algun tipo de incopatibilidad.(directamente el treeview no funciona como deberia con .NET)

Código:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'On Error Resume Next
        Dim Codigo, Descripcion As String
        Dim TotalReg As Long
        Dim Registro As DataRow
        Dim Nombre, Hijos, Child

        'Me.MousePointer = 11
        tv.Nodes.Clear()

        strSQL = "SELECT * FROM DimTempCustomer WHERE DimT_Padre=''"
        MiAdaptador = New OleDb.OleDbDataAdapter(strSQL, MyConexion.ConnectionString)
        MiAdaptador.Fill(dsDataSet, "Raiz")

        Codigo = Trim(dsDataSet.Tables("Raiz").Rows(0).Item("DimT_Codigo"))
        Descripcion = Trim(dsDataSet.Tables("Raiz").Rows(0).Item("DimT_Descripcion"))

        tv.Nodes.Add(, , "Cabecera", "[" & Codigo & " ]" & "[" & Descripcion & "]")

        'padres e hijos :)
        strSQL = "SELECT * FROM DimTempCustomer WHERE DimT_Padre='" & Codigo & "'"
        MiAdaptador = New OleDb.OleDbDataAdapter(strSQL, MyConexion.ConnectionString)
        MiAdaptador.Fill(dsDataSet, "Primero")

        TotalReg = 0
        For Each Registro In dsDataSet.Tables("Primero").Rows
            TotalReg = TotalReg + 1
            Codigo = Trim(Registro.Item("DimT_Codigo"))
            Descripcion = Trim(Registro.Item("DimT_Descripcion"))

            Nombre = Codigo & "A"
            Hijos = Hijos & "-//-" & Codigo
            tv.Nodes.Add("Cabecera", Child, Nombre, "[" & Codigo & "]" & "[" & Descripcion & "]")

            Application.DoEvents()
        Next

        'si no contiene hijos lo borro despues de la confirmacion
        If TotalReg <> 0 Then
            Verificar_hijos(Hijos)
        End If
    End Sub

    Function Verificar_hijos(ByVal Hijos)
        'On Error Resume Next
        Dim i As Integer
        Dim Codigo, Descripcion, Nombre, Child, Check_Hijo, Hijos2 As String
        Dim Hijo
        Dim TotalReg
        Dim Registro As DataRow

        'desgloso la variable Temp, y recorro en un bucle para ver si tienen hijos
        Hijo = Split(Hijos, "-//-")
        For i = 1 To UBound(Hijo)

            Check_Hijo = Trim(Hijo(i))
            strSQL = "SELECT * FROM DimTempCustomer WHERE DimT_Padre='" & Check_Hijo & "'"
            MiAdaptador = New OleDb.OleDbDataAdapter(strSQL, MyConexion.ConnectionString)
            MiAdaptador.Fill(dsDataSet, Check_Hijo)

            TotalReg = 0
            For Each Registro In dsDataSet.Tables("Primero").Rows
                TotalReg = TotalReg + 1
                Codigo = Trim(Registro.Item("DimT_Codigo"))
                Descripcion = Trim(Registro.Item("DimT_Descripcion"))

                Nombre = Codigo & "A"
                tv.Nodes.Add(Check_Hijo + "A", Child, Nombre, "[" & Codigo & "]" & " " & Descripcion)
                Hijos2 = Hijos2 & "--" & Codigo
                Application.DoEvents()
            Next
            'si ese hijo tiene hijos
            If Not TotalReg = 0 Then
                Verificar_hijos(Check_Hijo)
            End If
        Next i

        Timer1.Enabled = False

    End Function

Disculpen lo extenso del post.

Saludos
En línea

Hadess_inf
Desesperado
Colaborador
***
Desconectado Desconectado

Mensajes: 2.048


Nueva Vida


Ver Perfil WWW
Re: Control TreeView
« Respuesta #9 en: 1 Noviembre 2007, 21:33 pm »

Recomendaria que uses un Data.DataTable ya que el manejo de datos entre el Dataset y datatable no es exactamente igual. Hazlo, y si te funciona lo posteas, de esa forma te podria explicar como van algunas lineas del codigo.

EDITO: Ademas que el usar el table ahorrara algo de codigo...  :rolleyes: :rolleyes: :rolleyes:
« Última modificación: 1 Noviembre 2007, 21:39 pm por hadess_inf » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Treeview VB.net
Programación General
tazrebelraider 0 3,515 Último mensaje 28 Febrero 2012, 05:53 am
por tazrebelraider
treeview.index
.NET (C#, VB.NET, ASP)
luismercedesrd 1 2,321 Último mensaje 10 Junio 2016, 03:03 am
por AlbertoBSD
Seleccionar Nodo de Treeview « 1 2 »
Programación Visual Basic
jack06 10 7,626 Último mensaje 8 Mayo 2017, 21:11 pm
por jack06
Ayuda treeview
.NET (C#, VB.NET, ASP)
alexlopez91 1 2,501 Último mensaje 18 Agosto 2017, 00:23 am
por Hadess_inf
TreeView y FullPath
Programación Visual Basic
temisto 0 1,574 Último mensaje 13 Enero 2018, 22:48 pm
por temisto
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines