El control TreeView tiene DOS punteros.
1. El puntero obtenido al desplazarse con el ratón o el teclado. Este puntero es el puntero físico porque es donde físicamente estamos situados. A él se llega mediante la propiedad CURRENT
2. El puntero obtenido al desplazarse para obtener información de otros nodos. Este puntero es el puntero lógico. A él se llega mediante la propiedad ITEM
Obtener información de nodos
tree.current.text ---> devuelve el texto del item en el que estamos actualmente.
El cursor lógico y el cursor físico coinciden
tree.moveparent ---> situa el cursor lógico en el item padre.
tree.item.text ---> devuelve el texto del item padre. El cursor físico sigue en el mismo sitio por eso tree.current.text sigue dando el mismo resultado que antes.
Los métodos Moveparent, movefirst, movelast, movenext, moveprevious, moveto(key) mueven el cursor lógico a partir del item físico en el que estemos situados. Es decir, sobre un item en el que nos hemos posicionado con el teclado o el ratón podemos utilizar los moves para movernos a otro item y obtener información de él. Esa información estará disponible en la propiedad ITEM.
Creación del treeview
Dim Tree as treeview
Tree=new Treeview
Tree=new Treeview
Creación de items
el argumento genérico es
tree.add(clave,texto, imagen,padre)
la clave es la key que permite ampliar o colapsar zonas.
Texto es el mensaje que se mostrará.
Imagen es el icono que tendrá ese item (no requerido)
Padre es el nodo del que depende.
Creación de la primera zona global
Tree.add("Zonas","Zonas")
Creación de un nodo hijo de Zonas
Tree.add(Pais,"España","Zonas")
Creación de un item hijo de España
Tree.add(Comunidad,"Madrid","España")
Ejemplo
Recorrer una tabla en la que hay campos pais, comunidad,region,provincia, ciudad e ir creando nodos en un treeview dinámicamente.
Se suponde un recordset ya abierto con acceso a esos campos llamado Rec y unas variables pais, comunidad, region, provincia,ciudad de tipo string creadas.
El recorset tiene los datos procedentes de "select * from ubicaciones order by Pais,Region,Provincia,Ciudad"
Tree.add("Zonas","Zonas")
Do while Rec.Available
Pais=Rec!Pais
Tree.add(Pais,Pais,,"Zonas")
do while Pais=Rec!Pais
Region=Rec!Region
Tree.add("Region","Region",,"Pais")
Do while Region=Rec!Region
Provincia=Rec!Provincia
Tree.add("Provincia","Provincia",,"Region")
Do while Provincia=Rec!Provincia
Ciudad=Rec!Ciudad
Tree.add("Ciudad","Ciudad",,"Provincia")
Rec.Movenext
If not Rec.Available then break
Loop
if not Rec.Available then break
loop
if not Rec.Available then break
loop
loop
Do while Rec.Available
Pais=Rec!Pais
Tree.add(Pais,Pais,,"Zonas")
do while Pais=Rec!Pais
Region=Rec!Region
Tree.add("Region","Region",,"Pais")
Do while Region=Rec!Region
Provincia=Rec!Provincia
Tree.add("Provincia","Provincia",,"Region")
Do while Provincia=Rec!Provincia
Ciudad=Rec!Ciudad
Tree.add("Ciudad","Ciudad",,"Provincia")
Rec.Movenext
If not Rec.Available then break
Loop
if not Rec.Available then break
loop
if not Rec.Available then break
loop
loop
Como resultado tendremos un treeview con todos los paises, regiones, provincias y ciudades presentes en la tabla.
Al pinchar en un elemento del tree queremos obtener todos los elementos de la tabla que tienen esa característica. Por ejemplo si pinchamos en España será que queremos todos los registros de pais="España". Si pinchamos en "Andalucia" será que queremos todos los registros de region="Andalucia" y si pinchamos en "Sevilla" será que queremos todos los registros de ciudad="Sevilla"
Tree.current.key ---> devuelve la clave del item actual
tree.item.key ----> devuelve la clave del item en el que está posicionado el cursor lógico.
select case tree.current.key
case "Pais"
Sql="select * from ubicaciones where Pais='" & tree.current.text & "'"
case "Region"
Sql="select * from ubicaciones where Region='" & tree.current.text & "'"
case "Ciudad"
Sql="select * from ubicaciones where Ciudad='" & tree.current.text & "'"
end select
case "Pais"
Sql="select * from ubicaciones where Pais='" & tree.current.text & "'"
case "Region"
Sql="select * from ubicaciones where Region='" & tree.current.text & "'"
case "Ciudad"
Sql="select * from ubicaciones where Ciudad='" & tree.current.text & "'"
end select
Con esa Sql ahora volcaríamos los resultados en un dataview o donde fuera.
Ahora bien, nos damos cuenta que puede haber ciudades con el mismo nombre en paises distintos. Para resolver el error necesitamos que la Sql extraiga pais y ciudad.
select case tree.current.key
case "Pais"
Sql="select * from ubicaciones where Pais='" & tree.current.text & "'"
case "Region"
Sql="select * from ubicaciones where Region='" & tree.current.text & "'"
case "Ciudad"
Tree.moveparent ---> nos situamos en el item padre del seleccionado
Padre=Tree.item.text
Tree.moveparent ----> nos situamos en el abuelo
Abuelo=Tree.item.text
Sql="Select * from ubicaciones where Pais='" & Abuelo & "' and Region='" & Padre & "' and ciudad='" & Tree.current.text & "'"
end select
case "Pais"
Sql="select * from ubicaciones where Pais='" & tree.current.text & "'"
case "Region"
Sql="select * from ubicaciones where Region='" & tree.current.text & "'"
case "Ciudad"
Tree.moveparent ---> nos situamos en el item padre del seleccionado
Padre=Tree.item.text
Tree.moveparent ----> nos situamos en el abuelo
Abuelo=Tree.item.text
Sql="Select * from ubicaciones where Pais='" & Abuelo & "' and Region='" & Padre & "' and ciudad='" & Tree.current.text & "'"
end select