Título: Control TreeView Publicado por: elmaro 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:
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. Título: Re: Control TreeView Publicado por: Hadess_inf 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") Título: Re: Control TreeView Publicado por: elmaro 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 Título: Re: Control TreeView Publicado por: Hadess_inf 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 Título: Re: Control TreeView Publicado por: elmaro 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 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. Título: Re: Control TreeView Publicado por: Hadess_inf en 1 Noviembre 2007, 01:43 am Recursividad ¿?
Sabras que es eso, supongo. Título: Re: Control TreeView Publicado por: elmaro 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 Título: Re: Control TreeView Publicado por: Hadess_inf 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: Título: Re: Control TreeView Publicado por: elmaro 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) 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 En el sub añade: Código: Sub añade(ByVal cod As String, ByVal node As TreeNode) 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 Disculpen lo extenso del post. Saludos Título: Re: Control TreeView Publicado por: Hadess_inf 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: Título: Re: Control TreeView Publicado por: elmaro en 1 Noviembre 2007, 23:26 pm exelente, mañana probare usar un datatalbe en lugar de dataset y luego lo comento, si funciona posteo el code.
Saludos Título: Re: Control TreeView Publicado por: elmaro en 2 Noviembre 2007, 15:57 pm 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 Título: Re: Control TreeView Publicado por: Hadess_inf en 2 Noviembre 2007, 16:58 pm 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 Citar Form.hide() Mostrar formulario Citar Form.show() Título: Re: Control TreeView Publicado por: elmaro en 2 Noviembre 2007, 18:11 pm 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 Título: Re: Control TreeView Publicado por: Hadess_inf en 2 Noviembre 2007, 21:01 pm 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.
Título: Re: Control TreeView Publicado por: elmaro en 3 Noviembre 2007, 03:39 am 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. Título: Re: Control TreeView Publicado por: Hadess_inf en 3 Noviembre 2007, 06:25 am Es una buena salida.. :xD :xD :xD :xD
Título: Re: Control TreeView Publicado por: elmaro en 5 Noviembre 2007, 17:29 pm Lo prometido es deuda.
En el Load del formulario: Código: Dim Host As String = "tuservidor" En el evento DoubleClick del TreeView: Código: Dim Host As String = "tuservidor" 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. Título: Re: Control TreeView Publicado por: gusman en 5 Noviembre 2007, 18:26 pm 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 Título: Re: Control TreeView Publicado por: elmaro en 5 Noviembre 2007, 19:08 pm Gracias gusman, ya agregue lo que me sugueriste :)
Saludos |