Foros del Web » Programación para mayores de 30 ;) » .NET »

Cómo lleno el treeview desde una sola tabla de mi bd?

Estas en el tema de Cómo lleno el treeview desde una sola tabla de mi bd? en el foro de .NET en Foros del Web. Hola amigos del foro, me pueden ayudar, estoy super angustiada tratando de llenar un treview desde una sola tabla, en vb.net 2005, sql2000. Resulta que ...
  #1 (permalink)  
Antiguo 22/04/2009, 16:08
 
Fecha de Ingreso: abril-2008
Mensajes: 82
Antigüedad: 16 años
Puntos: 0
Pregunta Cómo lleno el treeview desde una sola tabla de mi bd?

Hola amigos del foro, me pueden ayudar, estoy super angustiada tratando de llenar un treview desde una sola tabla, en vb.net 2005, sql2000.
Resulta que tengo la tabla Cuentas donde en un registro el campo cuenta es único por ej "1.0.0.00.00" pero en otros ese valor de cuenta se puede repetir como campo cuentapadre donde varios registros pueden tener como cuentapadre el valor "1.0.0.00.00" o sea en la misma tabla tengo al padre y sus hijos, y los hijos de sus hijos y así sucesivamente. Los primeros padres son solo cinco, cinco niveles diferentes y de ahí cada padre puede heredar n hijos.
Pero nosé como llamar a esos datos de la bd.
Traté de hacer dos consultas, para ligar cuenta con cuentapadre pero creo que no están bien.

los campos son los valores son por ej

Naturaleza nodo1 nodo2 nodo3 nodo4 nodo5

Nivel 1 2 3 4 5

Cuenta 1.0.0.00.00 2.0.0.00.00 3.0.0.00.00 4.0.0.00.00 5.0.0.00.00

también está el campo descripcion que vendría siendo los nombres de los demás nodos, por ej

descripcion nodo1.1 nodo2.1 nodo 3.1 nodo 4.1 nodo 5.1

descripcion nodo 1.2 nodo 2.2 nodo 3.2 nodo 4.2 nodo 5.2 , etc

y dentro de cada uno hay hijos y mas hijos con un numero de cuenta único, por ej el hijo de nodo1 tiene cuenta 1.1.0.00.00 y la cuenta de su padre es 1.0.0.00.00 y así sucesivamente...

para llenar el treeview desde la bd tengo el sgte codigo que adapté de internet

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim nodo As TreeNode

' crear conexión
Dim oConexion As New SqlConnection
oConexion.ConnectionString = "Server=(local);Database=basedatos;uid=usuario;pwd =password;"

' crear los DataAdapter
Dim oDACuentas As New SqlDataAdapter("SELECT Naturaleza,Nivel,Cuenta FROM Cuentas ORDER BY Nivel", oConexion)

Dim oDACuentas1 As New SqlDataAdapter("SELECT Descripcion,Cuenta,CuentaPadre FROM Cuentas where CuentaPadre in (Select CuentaPadre FROM Cuentas where Cuenta in (select Cuenta from Cuentas))", oConexion) 'creo que no está bien

' crear conjunto de datos
Dim oDataSet As New DataSet

' abrir la conexión
oConexion.Open()

' utilizar los adaptadores para llenar el dataset con las tabla
oDACuentas.Fill(oDataSet, "Cuentas")
oDACuentas1.Fill(oDataSet, "Cuentas")


' cerrar la conexión
oConexion.Close()

' defino variables del tipo DataTable
Dim oTablaCuentas As DataTable
Dim oTablaCuentas1 As DataTable

' asigno a las variables los datos de las tablas del DataSet
oTablaCuentas = oDataSet.Tables("Cuentas")
oTablaCuentas1 = oDataSet.Tables("Cuentas")

' lleno la vista con el contenido de la Tabla Cuentas
oVista = oTablaCuentas.DefaultView

' deshabilita la actualización en pantalla del control TreeView
TreeView1.BeginUpdate()

' defino variable del tipo DataRow
Dim Registro As DataRow

' creo un nodo raiz
nodo = TreeView1.Nodes.Add("Plan de Cuentas")

For Each Registro In oTablaCuentas.Rows
' agrego el nodo en el segundo nivel
nodo = TreeView1.Nodes(0).Nodes.Add(Trim(Registro("Natura leza")))
' si no hay un nodo raiz, se usaría la siguiente línea
'nodo = TreeView1.Nodes.Add(Trim(Registro("Naturaleza")))

' realizo un filtro dentro de la vista
oVista.RowFilter = "CuentaPadre = " & Registro("CuentaPadre")
' acá me da el sgte error : falta el operando después del operador '='.

' ciclo para recorrer la vista previamente filtrada
Dim a As Integer
For a = 0 To oVista.Count - 1
' agrego el nodo en el tercer nivel
nodo.Nodes.Add(Trim(oVista.Item(a).Row("Descripcio n")))
Next
' expando todos los nodos de árbol secundario
nodo.ExpandAll()
Next
' habilita la actualización en pantalla del control TreeView
TreeView1.EndUpdate()

' modifico la propiedad AllowDrop a True para poder realizar Drag and Drop
TreeView1.AllowDrop = True

' modifico la propiedad Sorted a True para que los nodos estén ordenados
TreeView1.Sorted = True
End Sub

En realidad no sé si saqué bien los datos de la bd, no me resulta y estoy bien complicada, si alguien me pudiera ayudar con la información que le proporcione le estaré muy agradecida.

Muchas gracias.
  #2 (permalink)  
Antiguo 22/04/2009, 16:24
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 10 meses
Puntos: 220
Respuesta: Cómo lleno el treeview desde una sola tabla de mi bd?

Podrias pasar unos registros de tu base de datos para ver como estan estructurados

Ejm:

Padre
Hijo
Nieto
Padre
Hijo
Nieto
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #3 (permalink)  
Antiguo 22/04/2009, 16:52
 
Fecha de Ingreso: abril-2008
Mensajes: 82
Antigüedad: 16 años
Puntos: 0
Respuesta: Cómo lleno el treeview desde una sola tabla de mi bd?

Ok, Por ej

Padre:

Cuenta 1.0.0.00.00
Naturaleza nodo1
nivel 1
Descripcion nodo1
CuentaPadre 0

Hijo

Cuenta 1.1.0.00.00
Naturaleza nodo1
nivel 1
Descripcion nodo1.1
CuentaPadre 1.0.0.00.00

Nieto

Cuenta 1.1.1.00.00
Naturaleza nodo1
nivel 1
Descripcion nodo1.1.1
CuentaPadre 1.1.0.00.00


Otro padre

Cuenta 2.0.0.00.00
Naturaleza nodo2
nivel 2
Descripcion nodo2
CuentaPadre 0

Hijo

Cuenta 2.1.0.00.00
Naturaleza nodo2
nivel 2
Descripcion nodo2.1
CuentaPadre 2.0.0.00.00

Nieto

Cuenta 2.1.1.00.00
Naturaleza nodo2
nivel 2
Descripcion nodo2.1.1
CuentaPadre 2.1.0.00.00

Esa es la estructura de los datos
  #4 (permalink)  
Antiguo 22/04/2009, 16:56
 
Fecha de Ingreso: abril-2008
Mensajes: 82
Antigüedad: 16 años
Puntos: 0
Respuesta: Cómo lleno el treeview desde una sola tabla de mi bd?

Ah, y son cinco niveles, son cinco nodos padres, al pricipio
nodo1
nodo2
nodo3
nodo4 y
nodo5
De ahí se derivan todos los demás.
  #5 (permalink)  
Antiguo 22/04/2009, 16:59
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 10 meses
Puntos: 220
Respuesta: Cómo lleno el treeview desde una sola tabla de mi bd?

Eso quiere decir q tu tabla tiene la siguiente estructura

Código:
Cuenta               Naturaleza             Nivel             Descripcion              CuentaPadre
1.0.0.00.00         Nodo1                   1                   nodo 1                     0
1.1.0.00.00         Nodo1                   1                   nodo 1.1                  1.0.0.00.00 
1.1.1.00.00         Nodo1                   1                   nodo 1.1.1               1.1.0.00.00 
2.0.0.00.00         Nodo2                   2                   nodo 2                     0
2.1.0.00.00         Nodo2                   2                   nodo 2.1                  2.0.0.00.00 
2.1.1.00.00         Nodo2                   2                   nodo 2.1.1               2.1.0.00.00
Dime de q forma quieres Mostrar Tu Data en el Treeview asi

Código:
 + Padre (Cuenta - Descripcion)
    |
    |+ Hijo (Cuenta - Descripcion)
         |
         |+ Nieto (Cuenta - Descripcion)
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones

Última edición por Dradi7; 23/04/2009 a las 08:20
  #6 (permalink)  
Antiguo 22/04/2009, 17:21
 
Fecha de Ingreso: abril-2008
Mensajes: 82
Antigüedad: 16 años
Puntos: 0
Respuesta: Cómo lleno el treeview desde una sola tabla de mi bd?

Exacto, esa es la estructura de la tabla y esa es la forma como debo mostrar los datos, tal como los has planteado

+ Padre (Cuenta - Descripcion)

+ Hijo (Cuenta - Descripcion)

+ Nieto (Cuenta - Descripcion)
  #7 (permalink)  
Antiguo 23/04/2009, 09:07
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 10 meses
Puntos: 220
Respuesta: Cómo lleno el treeview desde una sola tabla de mi bd?

Bueno aca te paso un Ejemplo de como llenar tu treeview pero solo lo llena hasta el nivel Nieto
eso quiere decir q dentro del nodo nieto no puede haber nodos

Código vb:
Ver original
  1. Dim Con As New SqlConnection("SERVER=(LOCAL);DATABASE=BD;UID=SA;PWD=;")
  2. Dim Adp As SqlDataAdapter
  3. Dim Ds As DataSet
  4. Dim Dt As New DataTable
  5. Dim Dw As New DataView
  6. Dim Nodo As TreeNode
  7.  
  8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  9.  
  10. ' Si la Conexion esta Abierta entonces la Cierro
  11.        If Con.State = 1 Then Con.Close()
  12.         ' Abro una Nueva Conexion
  13.        Con.Open()
  14.  
  15.         Adp = New SqlDataAdapter("Select * From Cuentas", Con) ' Ejecuntando la Consulta
  16.        Ds = New DataSet                    ' Creando un Nuevo Objeto DataSet
  17.        Adp.Fill(Ds, "x")                   ' Llenando el DataSet con el Resultado de la Consulta ' Asignando la Tabla al DataTable
  18.        Dw.Table = Ds.Tables("x")           ' Asignando al DataView Nuestro DataTable
  19.        Dw.RowFilter = "CuentaPadre = '0'"     ' Filtrando por El Padre
  20.        Dt = Dw.ToTable                     ' Asignando al DataTable la Tabla Filtrada
  21.  
  22.         With TreeView1
  23.             .BeginUpdate()  ' Evitando la Actualizacion del Control
  24.  
  25.             Nodo = .Nodes.Add("Plan de Cuentas")
  26.             For Each Row As DataRow In Dt.Rows
  27.  
  28.                 Nodo.Nodes.Add(Row(0) + " - " + Row(3)) ' Rellenando el Nodo Principal
  29.                Dw.Table = Ds.Tables("x")
  30.                 Dw.RowFilter = "CuentaPadre = '" + Row(0).ToString + "'"
  31.                 Dt = Dw.ToTable
  32.  
  33.                 For Each RowH As DataRow In Dt.Rows
  34.  
  35.                     ' Agregando el Hijo
  36.                    Nodo.Nodes(Nodo.Nodes.Count - 1).Nodes.Add(RowH(0) + " - " + RowH(3))
  37.                     Dw.Table = Ds.Tables("x")
  38.                     Dw.RowFilter = "CuentaPadre = '" + RowH(0).ToString + "'"
  39.                     Dt = Dw.ToTable
  40.  
  41.                     For Each RowN As DataRow In Dt.Rows
  42.                         ' Agregando el Nieto
  43.                        Nodo.Nodes(Nodo.Nodes.Count - 1).Nodes(Nodo.Nodes(Nodo.Nodes.Count - 1).Nodes.Count - 1).Nodes.Add(RowN(0) + " - " + RowN(3))
  44.                     Next
  45.                 Next
  46.             Next
  47.  
  48.             .EndUpdate()        ' Actulizando el Control
  49.            .AllowDrop = True   ' Realizar Drag and Drop
  50.            .Sort()
  51.  
  52.         End With
  53.  
  54. End Sub
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones

Última edición por Dradi7; 23/04/2009 a las 11:56
  #8 (permalink)  
Antiguo 23/04/2009, 11:30
 
Fecha de Ingreso: abril-2008
Mensajes: 82
Antigüedad: 16 años
Puntos: 0
Respuesta: Cómo lleno el treeview desde una sola tabla de mi bd?

Hola Dradi, bueno primero que nada quiero agradecerte por tomarte el tiempo de ayudarme, he estado usando tu codigo pero me han salido algunos problemitas.

Al principio no reconocia

Dw.RowFilter = "CuePadre = '0'"

salía "no se puede encontrar la columna "cuepadre" " así que lo cambié a "CuentaPadre" que es el verdadero nombre del campo.

Lo otro, es que no entra al ciclo for each

For Each Row As DataRow In Dt.Rows

por lo tanto en la pantalla sólo aparece "Plan de Cuentas" y al hacer dblclick no hace nada, por lo que cambié

Dt = Dw.ToTable por Dt = Dw.Table

y ahí si entra al primer ciclo For Each Row As DataRow In Dt.Rows

pero aparece en cada nodo solo el primer campo de la tabla, el cual no necesito visualizar, y aparecen todos los registros de la tabla no solo los cinco primeros nodos nivel1,nivel2,nivel3,nivel4,nivel5, por lo cual se demoran en aparecer los datos en pantalla.

Para que entre a los dos siguientes For Each debo cabiar de nuevo

Dt = Dw.ToTable por Dt = Dw.Table

sino no entra ni a

For Each RowH As DataRow In Dt.Rows ni a
For Each RowN As DataRow In Dt.Rows

pero cuando lo cambio, y entra a cualquiera de los dos, se convierte en un buclé infinito.

Para que en los primeros nodos mostrara el numero de cuenta cambié la consulta a ("select Cuenta,Descripcion,CuentaPadre,Nivel from Cuentas") pero los
repite, debiese mostrar solo aquellos cuya cuenta padre es 0 o NULL,o sea cinco en total, y creo que el campo cuenta no aparece correctamente escrito,
si coloco menos datos en la consulta ("select Cuenta,Descripcion,CuentaPadre from Cuentas"), aparece el sgte error

Nodo.Nodes.Add(Row(0) + " - " + Row(3)) 'No se puede encontrar la columna 3.

así que la tengo que dejar así ya que si coloco "select *" , me muestra el primer campo y no lo necesito visualizar.

Bueno, eso es, nunca pensé que fuera tan difícil llenar un treeview, espero me puedas seguir ayudando.

Muchas gracias.
  #9 (permalink)  
Antiguo 23/04/2009, 11:58
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 10 meses
Puntos: 220
Respuesta: Cómo lleno el treeview desde una sola tabla de mi bd?

Puedes Mostrarme como quieres q quede el resultado final de tu treeview con Data por supuesto
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #10 (permalink)  
Antiguo 23/04/2009, 12:11
 
Fecha de Ingreso: abril-2008
Mensajes: 82
Antigüedad: 16 años
Puntos: 0
Respuesta: Cómo lleno el treeview desde una sola tabla de mi bd?

Hola Dradi, ahora dejé la consulta así

"select Cuenta,Descripcion,CuentaPadre,Nivel From Cuentas where CuentaPadre = '0' order by Nivel"

y me muestra solo cinco(en el primer nivel,como debe ser), pero el dato cuenta no lo muestra correctamente, es un varchar

debiera salir

1.0.0.00.00

2.0.0.00.00

3.0.0.00.00

4.0.0.00.00

5.0.0.00.00

y aparece

2999999

3999999

4999999

9999999

9999999

Los datos debieran aparecer así

-Plan de Cuentas

1.0.0.00.00 "Descripcion"
1.1.0.00.00 "Descripcion"
1.1.1.00.00 "Descripcion"
-----
-----
2.0.0.00.00 "Descripcion"
2.1.0.00.00 "Descripcion"
2.1.1.00.00 "Descripcion"
------
------
3.0.0.00.00 "Descripcion"
3.1.0.00.00 "Descripcion"
3.1.1.00.00 "Descripcion"
-------
------
4.0.0.00.00 "Descripcion" 'lo mismo con el 4

5.0.0.00.00 "Descripcion" 'y el cinco

se debe ver el campo Cuenta y Descripcion.
  #11 (permalink)  
Antiguo 23/04/2009, 12:20
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 10 meses
Puntos: 220
Respuesta: Cómo lleno el treeview desde una sola tabla de mi bd?

Puedes Incluir tu Codigo para ver como lo estas realizando porq yo he hecho la prueba con mi codigo y me sale excelentemente
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #12 (permalink)  
Antiguo 23/04/2009, 17:21
 
Fecha de Ingreso: abril-2008
Mensajes: 82
Antigüedad: 16 años
Puntos: 0
Respuesta: Cómo lleno el treeview desde una sola tabla de mi bd?

Dradi, tenías toda la razón, el código resulta muy bien, ya no aparecen esos errores extraños de un principio, lo único que modifiqué fue la consulta para que aparecieran los datos como debe ser "Cuenta y Descripcion", y resulta bien, el único problemita es que esos valores de campos "Cuenta y Descripcion" se repiten en varios registros por lo cual hay muchos nodos iguales, o repetidos, con el mismo numero de Cuenta y con la misma Descripcion, traté de filtrarla con un distinct en la consulta así

"Select distinct Cuenta,* From Cuentas"
pero no pasó nada, y el código que creaste está igual solo modifiqué un poco la consulta

Imports System.Data.SqlClient
Public Class Form3

Dim Con As New SqlConnection("SERVER=servidor;DATABASE=bd;UID=usu ario;PWD=password;")
Dim Adp As SqlDataAdapter
Dim Ds As DataSet
Dim Dt As New DataTable
Dim Dw As New DataView
Dim Nodo As TreeNode

Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

' Si la Conexion esta Abierta entonces la Cierro
If Con.State = 1 Then Con.Close()
' Abro una Nueva Conexion
Con.Open()

Adp = New SqlDataAdapter("Select Cuenta,* From Cuentas", Con) ' Ejecuntando la Consulta
Ds = New DataSet ' Creando un Nuevo Objeto DataSet
Adp.Fill(Ds, "x") ' Llenando el DataSet con el Resultado de la Consulta ' Asignando la Tabla al DataTable
Dw.Table = Ds.Tables("x") ' Asignando al DataView Nuestro DataTable
Dw.RowFilter = "CuentaPadre = '0'" ' Filtrando por El Padre
Dt = Dw.ToTable ' Asignando al DataTable la Tabla Filtrada

With TreeView1
.BeginUpdate() ' Evitando la Actualizacion del Control

Nodo = .Nodes.Add("Plan de Cuentas")
For Each Row As DataRow In Dt.Rows

Nodo.Nodes.Add(Row(0) + " - " + Row(3)) ' Rellenando el Nodo Principal
Dw.Table = Ds.Tables("x")
Dw.RowFilter = "CuentaPadre = '" + Row(0).ToString + "'"
Dt = Dw.ToTable

For Each RowH As DataRow In Dt.Rows

' Agregando el Hijo
Nodo.Nodes(Nodo.Nodes.Count - 1).Nodes.Add(RowH(0) + " - " + RowH(3))


Dw.Table = Ds.Tables("x")
Dw.RowFilter = "CuentaPadre = '" + RowH(0).ToString + "'"
Dt = Dw.ToTable

For Each RowN As DataRow In Dt.Rows

' Agregando el Nieto

Nodo.Nodes(Nodo.Nodes.Count - 1).Nodes(Nodo.Nodes(Nodo.Nodes.Count - 1).Nodes.Count - 1).Nodes.Add(RowN(0) + " - " + RowN(3))

Next
Next
Next

.EndUpdate() ' Actulizando el Control
.AllowDrop = True ' Realizar Drag and Drop
.Sort()

End With

End Sub


End Class

Lo otro, será muy dificil, hacer que se puedan crear o visualizar n nodos?, o sea no llegar solo hasta los nietos, sino que seguir, ya que en mi tabla hay muchas más generaciones hacia abajo.
Bueno, muchas gracias igual, ya que me has ayudado mucho.
Muchos Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:35.