Control TreeView

Iniciado por elmaro, 30 Octubre 2007, 16:47 PM

0 Miembros y 1 Visitante están viendo este tema.

elmaro

exelente, mañana probare usar un datatalbe en lugar de dataset y luego lo comento, si funciona posteo el code.

Saludos


elmaro

bueno, al fin. pude cargar el treeview. con exactamente el code q postiastes.
lo unico que me surgio un gran gran problema

al cargar los 7000 registros el tiempo de espera es alto
tarda aproximadamente 12 minutos, entre que hace las consultas revisa y carga.

no hay forma de guardar el control junto con sus datos de tal forma que cuando el usuario quiera ver el arbol no lo tenga que volver a cargar, sino simplemente cargar el control con los datos previamente cargados.


muchas gracias nuevamente

Hadess_inf

#12
Bueno no sabria decirte porque nunca he hecho algo parecido, pero podria sugerir que intentes un par de cosas.

Lo primero seria que ese formulario cuando no lo necesites no lo cierres, sino que lo ocultes, y cuando lo quieras usar nuevamente lo haces visible, con esto el treeview ya no tendria que llenarse cada vez que cargues el formulario.

Ocultar formulario
CitarForm.hide()

Mostrar formulario
CitarForm.show()

elmaro

si, podria ser. pero el usuario no va a querer esperar 11 minutos desde un principio, y sin contar que los registros pueden aumentar un poco.

bueno, voy a tratar de buscar otra solucion. muchisimas gracias por tu ayuda hadess_inf

Hadess_inf

Bueno claro que la cantidad de tiempo que demore en llenarse el control sera bastante, bueno todo eso depende del equipo en el cual se este trabajando(me refiero al hardware), aun asi, buscare una alternativa y vere si se puede agilizar ese proceso, saludos. Si encuentras una respuesta a tu problema posteala.

elmaro

Bueno hadess_inf, te cuento. Encontre la solucion al 100% de mi problema.
Hize lo siguiente:
En lugar de cargar todo el arbol al cargar el formulario, decidi solo cargar la raiz del arbol, osea, un solo item.
Luego si se quieren ver los que cuelgan del item se le hace doble click y se cargan los items del segundo nivel.
Si se queire ver lo que cuelga de alguno de esos items recien cargados, se le hace doble click. Y asi hasta llegar a donde quiera sin necesidad de cargar datos innesesarios que el usuario no va a mirar.

El tiempo es altamente importante en estas situaciones, el cual fue reducido a una respuesta casi instantanea en el peor de los casos.
El codigo esta muy interesante y es muy sencillo y la idea me la dio mi jefe cuando me dije: "Mostra lo que necesitas"

El lunes temprano posteo el codigo para que este disponible, ya que esta en el trabajo y no en mi casa.


Saludos y muchas gracias por tu colaboracion.

Hadess_inf


elmaro

Lo prometido es deuda.

En el Load del formulario:


        Dim Host As String = "tuservidor"
        Dim con As New OleDb.OleDbConnection("Provider=SQLOLEDB; Data Source=" & Host & "; Initial Catalog=TuBase; integrated security=SSPI; persist security info=True;")

        Dim da As OleDb.OleDbDataAdapter
        Dim dtb As DataTable
        Dim a As Integer

        Dim Codigo As String

        da = New OleDb.OleDbDataAdapter("select * from dimtempcustomer where dimt_padre=''", con)
        dtb = New DataTable
        da.Fill(dtb)

        TreeView1.Nodes.Add(Trim("[" & dtb.Rows(a)("dimt_codigo").ToString) & "]-- " & Trim(dtb.Rows(0)("dimt_descripcion").ToString))
        Codigo = Trim(dtb.Rows(0)("dimt_codigo").ToString)


En el evento DoubleClick del TreeView:


Dim Host As String = "tuservidor"
        Dim con As New OleDb.OleDbConnection("Provider=SQLOLEDB; Data Source=" & Host & "; Initial Catalog=TuBase; integrated security=SSPI; persist security info=True;")

        Dim da As OleDb.OleDbDataAdapter
        Dim dtb As DataTable
        Dim a, i As Integer
        Static Cargados As String

        Dim Codigo, Descripcion As String
        Dim parte = Split(TreeView1.SelectedNode.Text, "]-- ")
        Dim flag = Split(Cargados, "--")

        Me.Cursor = Cursors.WaitCursor
        Codigo = Trim(Mid(parte(0), 2))

        For i = 1 To UBound(flag)
            If Codigo = flag(i) Then
                Me.Cursor = Cursors.Default
                Exit Sub
            End If
        Next
        Cargados += "--" & Codigo
        da = New OleDb.OleDbDataAdapter("select * from dimtempcustomer where dimt_padre='" & Codigo & "'", con)
        dtb = New DataTable
        da.Fill(dtb)

        For a = 0 To dtb.Rows.Count - 1
            Codigo = Trim(dtb.Rows(a)("dimt_codigo").ToString)
            Descripcion = Trim(dtb.Rows(a)("dimt_descripcion").ToString)

            TreeView1.SelectedNode.Nodes.Add("[" & Codigo & "]-- " & Descripcion)
        Next
        TreeView1.SelectedNode.Expand()
        Me.Cursor = Cursors.Default


Lo de la conexion se puede arreglar para que sea menos codigo.
Espero les sirva el codigo, le agradezco mucho a hadess_inf por responder mis preguntas.

Gracias.

gusman

Usa TreeView1.BeginUpdate() antes de comenzar a actualizar el treeview y TreeView1.EndUpdate() cuando acabes, de esta forma evitas que se redibuje el control mientras estás añadiendo nuevos elementos.

Un saludo
No está muerto todo lo que yace y con extraños evos hasta la misma muerte puede morir.

elmaro

Gracias gusman, ya agregue lo que me sugueriste :)

Saludos