You are on page 1of 27

el Guille, la Web del Visual Basic, C#, .NET y ms...

Lo+ - WinFX - .NET - ADO.NET - ASP.NET - Cmo... - Colabora - VB6 - API - HTML - Vista - Links - Foros

Llenar un TreeView desde un DataSet usando un mtodo recurrente


Utilizar la jerarqua definida en los datos de una tabla para llenar el TreeView con un mtodo recurrente sencillo.
Fecha: 13/Ene/2005 (12/Ene/05) Autor: Serge Valsse (svalsse@hotmail.com)

En muchas oportunidades he necesitado llenar un TreeView con los datos contenidos en una tabla de mi base de datos. Normalmente se tiene bien clara la jerarqua de los datos que se desean mostrar en la misma estructura de la tabla y esto se puede aprovechar para evitar estar definiendo nodo por nodo en el TreeView. De igual manera si los datos que llenarn el TreeView no estn en una tabla se puede generar un DataSet con los diferentes modos que existen y obtener la estructura que se requiere para este mtodo que describir en este artculo. Supongamos que tenemos una tabla en nuestra base de datos con la siguiente estructura y datos:

Figura 1. Estructura de Tabla de origen de datos para llenar TreeView.

Obviamente los nombres pueden ser diferentes, pero para el ejemplo se necesitan que se llamen as. NombreNodo: Deber contener el texto que se desea desplegar en el TreeView como nodo. IdentificadorNodo: Un nmero nico que identifica a cada nodo. Puede ser el valor de la llave primaria de la tabla o algn otro campo calculado pero que sea nico. Para este ejemplo es nmerico pero puede ser string si as se requiere haciendo los cambios respectivos en el cdigo desde luego. IdentificadorPadre: Este campo debe contener el IdentificadorNodo del Nodo del cual depende es Nodo representado en el registro. Para el ejemplo vamos a utilizar los siguientes datos:

Figura 2. Ejemplo de datos con jerarqua definida para llenar TreeView.

Si observamos el IdentificadorNodo del "Nodo 1" (que es 1), est en el campo IdentificadorPadre del "Nodo 1.1" y "Nodo 1.2", esto indica que sern hijos de "Nodo 1", de igual manera "Nodo 1.1.1" y "Nodo 1.1.2" sern hijos de "Nodo 1.1" ya que contienen en IdentificadorPadre el IdentificadorNodo que corresponde a este (2 para este caso). Observe que los Nodos del primer nivel, es decir los que no tienen Padre deben llevar el valor 0 (cero) en el campo IdentificadorPadre ya que no dependen de nadie. Bien, veamos ahora cual es el cdigo del mtodo que har el trabajo de llenar el TreeView utilizando toda esta estructura de datos.

Creacin de un formulario que llene un TreeView desde un DataSet usando un mtodo recurrente
Para el ejemplo seguiremos los siguientes pasos: 1. Crear un proyecto de tipo Proyectos de Visual C#, Aplicacin para Windows y llmelo EjemploTreeView. 2. En el formulario generado (Form1) agrege dos controles, un TreeView y un Button. Desde la ventana de propiedades del botn asignar la propiedad Text = "Llenar TreeView". 3. Declare un DataSet que pueda ser vista por toda la clase Form1. System.Data.DataSet dataSetArbol; 4. En la ventana de Cdigo agrege el mtodo que se ejecutar recurrentemente llamndolo CrearNodosDelPadre.

private void CrearNodosDelPadre(int indicePadre, TreeNode nodePadre) { // Crear un DataView con los Nodos que dependen del Nodo padre pasado como parmetro. DataView dataViewHijos = new DataView(dataSetArbol.Tables["TablaArbol"]); dataViewHijos.RowFilter = dataSetArbol.Tables["TablaArbol"].Columns["IdentificadorPadre"].ColumnNam e + " = " + indicePadre; // Agregar al TreeView los nodos Hijos que se han obtenido en el DataView. foreach(DataRowView dataRowCurrent in dataViewHijos) { TreeNode nuevoNodo = new TreeNode(); nuevoNodo.Text = dataRowCurrent["NombreNodo"].ToString().Trim(); // si el parmetro nodoPadre es nulo es porque es la primera llamada, son los Nodos // del primer nivel que no dependen de otro nodo. if(nodePadre == null) { treeView1.Nodes.Add(nuevoNodo); } // se aade el nuevo nodo al nodo padre. else { nodePadre.Nodes.Add(nuevoNodo); } // Llamada recurrente al mismo mtodo para agregar los Hijos del Nodo recin agregado. CrearNodosDelPadre(Int32.Parse(dataRowCurrent["IdentificadorNodo"].ToStri ng()), nuevoNodo); } } 5. Para simplificar el ejemplo, adicione los siguientes mtodos que simularn los datos obtenidos desde una base de datos. // Los siguientes dos mtodos son para el ejemplo, el dataset puede ser llenado desde una tabla // de la base de datos. Lo importante es que contenga un equivalente a los tres campos que se // llenan aqui. private void CrearDataSet() { dataSetArbol = new DataSet("DataSetArbol"); DataTable tablaArbol = dataSetArbol.Tables.Add("TablaArbol"); tablaArbol.Columns.Add("NombreNodo",typeof(string)); tablaArbol.Columns.Add("IdentificadorNodo",typeof(Int32)); tablaArbol.Columns.Add("IdentificadorPadre",typeof(Int32));

InsertarDataRow("Nodo InsertarDataRow("Nodo InsertarDataRow("Nodo InsertarDataRow("Nodo InsertarDataRow("Nodo

1",1,0); 1.1",2,1); 1.1.1",3,2); 1.1.2",4,2); 1.2",5,1);

InsertarDataRow("Nodo 2",6,0); InsertarDataRow("Nodo 2.1",7,6); InsertarDataRow("Nodo 2.2",8,6); InsertarDataRow("Nodo 3",9,0); InsertarDataRow("Nodo 3.1",10,9); InsertarDataRow("Nodo 3.2",11,9); } private void InsertarDataRow(string column1, int column2, int column3) { DataRow nuevaFila = dataSetArbol.Tables["TablaArbol"].NewRow(); nuevaFila["NombreNodo"] = column1; nuevaFila["IdentificadorNodo"] = column2; nuevaFila["IdentificadorPadre"] = column3; dataSetArbol.Tables["TablaArbol"].Rows.Add(nuevaFila); } 6. En el constructor de la clase Form1() ingrese la llamada al mtodo que llenar el DataSet. El cdigo quedar como sigue: public Form1() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // CrearDataSet();

} 7. Finalmente en el evento Click del boton button1 asocie el mtodo siguiente que llamar al mtodo para el llenado del TreeView.

private void button1_Click(object sender, System.EventArgs e) { // Llamar al mtodo por primera vez que llenar el TreeView, este mtodo se llamar luego // a s mismo recurrentemente. CrearNodosDelPadre(0, null); } 8. Compile y ejecute el proyecto. Lo que obtendremos es lo siguiente:

Figura 3. Resultado despus de hacer Click en el botn "Llenar TreeView".

Si necesitas obtener el IdentificadorNode del Nodo que el usuario selecciona se puede utilizar la propiedad Tag del nodo, por supuesto si previamente en la creacin del nodo se almacen dicho valor en esta propiedad. Por favor no olvides calificar el artculo en la caja de PanoramaBox que se muestra al inicio de la pgina.

EJEMPLO2

Loveless, nico en su especie


El blog de un informtico con una buena ortografa Inicio

Escriba el texto a buscar Enviar

Inicio > SQL Server, Tecnologas Microsoft, SQL Server, .NET, Programacin, C#, Base de datos > Llenar un TreeView de ASP.NET con datos de SQL Server mediante recursividad

Llenar un TreeView de ASP.NET con datos de SQL Server mediante recursividad


Septiembre 17, 2010 lovelessisma Deja un comentario Ir a los comentarios La vez pasa sub un artculo sobre recursividad en SQL Server, ahora sin ms prembulo hay que darle uso a eso. En este primer ejemplo realizaremos una estructura de rbol en ASP.NET y C#, conocida como TreeView. La llenaremos de forma recursiva usando un procedimiento almacenado y con datos de la tabla tm_ubigeo. En este artculo est el cdigo SQL de la base. Primero creamos nuestro TreeView, al que llamaremos treevUbigeo, por supuesto despus de haber creado el sitio Web en Visual Studio 2008 y haber agregado una pgina llamada sample1_TreeViewRecursivo.aspx (o como ustedes quieran que se llame):

Ahora iremos a la base creada en SQL Server 2005 y creamos el siguiente procedimiento almacenado: Cdigo:
ver fuente imprimir?

01 alter procedure [dbo].[pa_ubigeo_listar] 02 ( 03 04 05 ) 06 as 07 begin 08 09 10 11 12 13 14 end end if @tipo = 'nodos' begin select tm_idubigeo, tm_nomubigeo, dbo.fc_Obtenervalorcomun('tm_tipoubigeo', tm_tipoubigeo) as tipoubigeo from tm_ubigeo where tm_idubigeosup = @param1 @tipo varchar(10), @param1 int

El cdigo anterior nos muestra un procedimiento almacenado que recibe dos parmetros, uno para definir el tipo de consulta y el otro para indicar el id de referencia. Consta de una condicin, la cual nos mostrar los registros que coincidan segn la id de referencia que enviemos. Ahora procedemos a crear una clase en el App_Code, a la cual llamaremos clsConexion, la cual tendr este cdigo: Cdigo:
ver fuente imprimir?

01 public class clsConexion 02 {

String var_cadenaconexion = (@"server=WINDOWS03 1F39AFE\SQLEXPRESS;database=bd_ejemplo_recursivo;integrated security=true"); 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public DataSet dtsUbigeoListar(string tipo, int idnodo) { DataSet var_resultado = new DataSet(); try { var_comando.CommandText = "pa_ubigeo_listar"; var_comando.CommandType = CommandType.StoredProcedure; var_comando.Connection = var_conexion; } public void cerrarconexion() { if (var_conexion.State == ConnectionState.Open) var_conexion.Close(); } public void abrirconexion() { var_conexion.ConnectionString = var_cadenaconexion; if (var_conexion.State == ConnectionState.Closed) var_conexion.Open(); } public clsConexion() { SqlConnection var_conexion = new SqlConnection(); SqlCommand var_comando = new SqlCommand(); SqlDataAdapter var_adaptador = new SqlDataAdapter();

var_comando.Parameters.Add("@tipo", SqlDbType.VarChar, 10).Value = tipo; var_comando.Parameters.Add("@param1", SqlDbType.Int).Value 35 = idnodo;

36 37 38 39 40 41 42 43 44 45 46 } } } }

var_adaptador.SelectCommand = var_comando; var_adaptador.Fill(var_resultado, "consulta"); var_comando.Parameters.Clear();

catch (Exception ex) { throw ex; return var_resultado;

Primero estn las variables necesarias para la conexin y ejecucin de procedimientos. Los primeros dos mtodos (aparte del constructor), son para abrir y cerrar la conexin a la base de datos respectivamente (si no lo has notado de seguro escuchas a Chino y Nacho a todo volumen mientras), y la funcin dtsUbigeoListar nos servir para llenar el DataSet, teniendo el mismo nmero de parmetros del procedimiento almacenado pa_ubigeo_listar. Nos dirigimos luego a la pgina Web, donde en su cdigo programaremos el mtodo mostrarNodos que har la lgica del llenado recursivo del TreeView: Cdigo:
ver fuente imprimir?

01 clsConexion cn = new clsConexion(); 02 private void mostrarNodos(TreeNode pad) 03 { 04 05 06 07 08 09 DataSet dts = new DataSet(); int i = 0; dts = cn.dtsUbigeoListar("nodos", Convert.ToInt32(pad.Value)); for(i = 1; i <= dts.Tables["consulta"].Rows.Count; i++) { TreeNode nodo = new TreeNode();

nodo.Text = dts.Tables["consulta"].Rows[i - 1] 10 ["tm_nomubigeo"].ToString() + " --- " + dts.Tables["consulta"].Rows[i 1]["tipoubigeo"].ToString(); 11 nodo.Value = dts.Tables["consulta"].Rows[i - 1]

["tm_idubigeo"].ToString(); 12 13 14 15 } } pad.ChildNodes.Add(nodo); mostrarNodos(nodo);

Este mtodo tiene como nico parmetro una variable de tipo TreeNode, cuyos valores cambiarn a cada llamada que se hace en la estructura for de la funcin, dentro de la cual se declara un nuevo nodo cada vez, y cada nodo creado se llenar de los datos obtenidos del DataSet que cambiarn tambin a cada llamada del mtodo, y los cuales se aadirn conforme el for siga su curso. Como vemos, se cumple la recursividad al llamarse a la misma funcin dentro del for. Al programar el siguiente cdigo en el evento Page_Load de la pgina, se lograr el llenado del TreeView: Cdigo:
ver fuente imprimir?

01 protected void Page_Load(object sender, EventArgs e) 02 { 03 04 05 06 07 08 09 10 11 } TreeNode nodo = new TreeNode(); this.treevUbigeo.Nodes.Clear(); nodo.Value = "0"; nodo.Text = "Ubigeo"; treevUbigeo.Nodes.Add(nodo); cn.abrirconexion(); mostrarNodos(nodo); cn.cerrarconexion();

Primero creamos un nodo nuevo, el cual agregaremos con datos iniciales, el valor 0 en su propiedad Value es muy importante dada la naturaleza de la funcin. El valor Text puede tener cualquier valor que busques, yo le puse Ubigeo. Aadimos el nuevo nodo, y abrimos conexin para dar paso a la ejecucin del mtodo anteriormente mencionado, y cerramos conexin. Es muy tedioso poner el abrir y cerrar conexin dentro del mtodo mostrarNodos, ya que hacemos que el proceso sea lento

porque se abrir y se cerrar conexin cada vez que el mtodo sea ejecutado. De esta manera es mejor y ms productivo. Ahora ejecutamos la pgina y vemos resultados:

Como ven resulta bastante til el uso de la recursividad para llenar este tipo de estructuras, ya que se hace de una manera rpida, fcil y sencilla (bueno sencillo a mi modo de ver jeje). Bueno pendejos este fue el primer ejemplo, habrn otros dos ms que de seguro les van a ser muy tiles. Nos vemos. "Tu religin apesta" ser el ttulo de un prximo artculo que subir Tienes algo que decir al respecto? Dudas sobre el ejemplo? Sugerencias? Escrbeme a lovelessisma@gmail.com.

Descargar

Comparte esto:

Facebook

Ads by Google

Categoras:SQL Server, Tecnologas Microsoft, SQL Server, .NET, Programacin, C#, Base de datos Etiquetas: Visual C#, SQL Server
Like Be the first to like this post.

Comentarios (0) Trackbacks (1) Deja un comentario Trackback 1. An no hay comentarios. 1. Septiembre 29, 2010 en 1:23 pm | #1 Combos (select) dependientes en ASP.NET con AJAX.NET, SQL Server y recursividad Loveless, nico en su especie

Deja un comentario
Your email address will not be published. Required fields are marked *

Nombre * Email * Web

Comentario You may use these HTML tags and attributes: <a href="" title=""> <abbr title="">
<acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Publicar Comentario

Recibir siguientes comentarios por correo. Recibir nuevas entradas por email. Comenten mierdas Recursividad con SQL Server RSS feed Google Youdao

Xian Guo Zhua Xia My Yahoo! NewsGator Bloglines iNezha

Categoras

.NET

AJAX Base de datos C# Java Javascript JQuery Linux MySql PHP Programacin Programas Software libre SQL Server SQL Server Tecnologas Microsoft Temas aparte Ubuntu Utilitarios

Entradas recientes

Ubuntu me parece una mierda He regresado Lamento la demora Quieres demostrar amistad sincera a tu amigo/a? Todo problema se convierte en ancdota

Buscar
Buscar por:
Buscar

Posts Ms Vistos

Ubuntu me parece una mierda... Formulario de acceso con Java y MySQL Acceso a base de datos SQL Server desde WebService, con aplicacin de escritorio Parte III Acceso a base de datos SQL Server desde WebService, con aplicacin de escritorio Parte II Subir mltiples archivos con Uploadify Acceso a base de datos SQL Server desde WebService, con aplicacin de escritorio Parte I Quieres demostrar amistad sincera a tu amigo/a?... Recursividad con SQL Server El peor da de mi vida Subir y redimensionar imgenes con PHP y SimpleImage

Archivero

Noviembre 2010 Octubre 2010 Septiembre 2010 Agosto 2010 Julio 2010

Plasta de etiquetas
Ajax ASP.NET Eclipse http://kzkggaara.wordpress.com

Java Linux MySQL

Otras cosas

PHP Programas

SQL Server Visual C#


Revuelto de categoras

.NET AJAX Base de datos C# Java Javascript JQuery Linux MySql


PHP

Programacin Programas Software libre SQL Server

Tecnologas Microsoft Temas


Utilitarios

aparte

Ubuntu

Loveless Isma

http://pbckt.com/sB.QKik 2 days ago http://pbckt.com/pB.d7oeFL 3 days ago http://pbckt.com/pB.dJdCdP 1 month ago http://pbckt.com/sB.UnCR 1 month ago http://pbckt.com/sB.Utyd 1 month ago

Arriba WordPress Copyright 2010 Loveless, nico en su especie Blog de WordPress.com. Theme: INove by NeoEase.

EJEMPLO 03

Hola, Geovanny: Ese error lo obtienes porque no ests encerrando entre comillas simples el valor devuelto por el objeto DataRow: dvHijos.RowFilter = "codpadre ='" & dr("codpadre").ToString & "'" De todas maneras, y observando el cdigo fuente que has publicado, creo que te ests complicando la vida para rellenar el objeto TreeView. Lo habitual en estos casos es disponer de dos tablas en la base de datos para poder relacionarlas a travs de un campo comn: una tabla sera la tabla Padres y otra la tabla Hijos, donde ambas tendra un campo llamado IdPadre que sera el que utilizaras para crear una relacin uno a varios entre las tablas Padres e Hijos.

Pero no es necesario que establezcas la relacin en la misma base de datos, porque la podemos crear en tiempo de ejecucin, tal y como muestra el siguiente ejemplo, que asume que en tu base de datos SQL Server tienes las siguientes tablas: Tabla Padres ========== IdPadre Nombre Clave principal

Tabla Hijos ======== IdHijo Nombre IdPadre Clave principal Igual al IdPadre de la tabla Padres

Para rellenar el objeto TreeView ejecutaras lo siguiente: ' Conexin con la base de datos ' Dim cnn As New SqlConnection("Data Source=(local);" & _ ' DataAdapters Dim daPadres As New SqlDataAdapter("Select * from Padres", cnn) Dim daHijos As New SqlDataAdapter("Select * from Hijos", cnn) ' DataSet Dim dsDatos As New DataSet ' Llenar el DataSet daPadres.Fill(dsDatos, "Padres") daHijos.Fill(dsDatos, "Hijos") ' Creamos una relacin a travs del campo IdPadre comn en ' ambos objetos DataTable. '

Dim parentColumn As DataColumn = _ dsDatos.Tables("Padres").Columns("IdPadre") Dim childColumn As DataColumn = _ dsDatos.Tables("Hijos").Columns("IdPadre") Dim rel As DataRelation = _ New DataRelation("Padres_Hijos", _ parentColumn, childColumn, True) ' Aadimos la relacin al objeto DataSet. ' dsDatos.Relations.Add(rel) ' Para que no se repinte el control TreeView hasta que ' se hayan creado los nodos. ' TreeView1.BeginUpdate() ' Limpiamos el control TreeView. TreeView1.Nodes.Clear() ' Aadimos un objeto TreeNode raz para cada objeto Padre ' existente en el objeto DataTable llamado Padres. ' For Each padre As DataRow In dsDatos.Tables("Padres").Rows ' Creamos el nodo padre. Dim parentNode As TreeNode = _ New TreeNode(padre.Item("Nombre").ToString) ' Lo aadimos a la coleccin Nodes del control TreeView. TreeView1.Nodes.Add(parentNode) ' Aadimos un objeto TreeNode hijo por cada objeto Hijo existente ' en el objeto Padre actual. ' For Each hijo In padre.GetChildRows("Padres_Hijos") ' Creamos el nodo hijo Dim childNode As TreeNode = _ New TreeNode(hijo.Item("Nombre").ToString)

' Lo aadimos al nodo padre parentNode.Nodes.Add(childNode) Next Next ' Repintamos TreeView. ' TreeView1.EndUpdate() Eso es todo! Como podrs comprobar, utilizando una relacin entre ambas tablas, no tienes que estar filtrando datos en un objeto DataView porque no sera necesario utilizarlo. Para probar el ejemplo, mejor ser que crees un nuevo proyecto, aadas al formulario de inicio un control TreeView, y modifiques la cadena de conexin para que se adapte a tus necesidades. Por supuesto, vuelvo a insistir que en el ejemplo se asume que en la base de datos existen dos tablas llamadas Padres e Hijos (u otras tablas con otros nombres), que ms o menos tengan la misma estructura que he indicado anteriormente. Un saludo
--

Hola, Alan: Entiendo que lo que deseas hacer es referenciar un formulario por el nombre de ste, es decir, si seleccionas un elemento del control TreeView llamado Form23 que se muestre dicho formulario. Para ello tendrs que utilizar el espacio de nombres System.Reflection. Si por ejemplo, tu proyecto se llama

WindowsApplication1, y dentro de l tienes una clase Form llamada Form23, referenciaras dicho formulario ejecutando el siguiente cdigo en el evento NodeMouseClick del control TreeView: Private Sub TreeView1_NodeMouseClick( ... ) ' Referenciamos el nodo donde se ha efectuado el clic ' Dim childNode As TreeNode = e.Node ' Si no es un nodo hijo, abandonamos el procedimiento ' If childNode.Parent Is Nothing Then Return Try ' Referenciamos el ensamblado que se est ejecutando. ' Dim asm As System.Reflection.Assembly = _ System.Reflection.Assembly.GetExecutingAssembly() ' Obtenemos una referencia de un objeto Form por su nombre. ' Dim frm As Form = _ DirectCast(asm.CreateInstance("TreeViewDemo." & _ childNode.Text), Form) frm.Show() Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub Un saludo
--------------------------------------------------------------------------

En este artculo paso a paso se describe cmo mostrar los datos de un conjunto de datos jerrquico mediante el control TreeView en Microsoft Visual Basic. NET. Para ello, establecer un principal, secundario y terciario relacin y rellnelo el control TreeView adecuadamente. TreeView control tiene una coleccin de nodos con raz objetos TreeNode. Cada objeto TreeNode tiene su propia coleccin de nodos que contiene ms de un objeto TreeNode de secundarios. A continuacin, puede utilizar el control TreeView para trabajar hacia abajo desde el nodo primario o raz para los nodos secundarios correspondiente y mostrar los datos apropiados.

Este ejemplo crea un conjunto de datos jerrquico, recorre cada tabla y agrega nodos al control TreeView para cada tabla secundaria en el conjunto de datos. Volver al principio

Requisitos
En la lista siguiente se describe el hardware, el software, la infraestructura de red y los Service Packs recomendados que necesitar:

Microsoft Visual Studio .NET instalado en un sistema operativo compatible con Microsoft Windows Un servidor SQL con la base de datos de ejemplo Neptuno instalada

En este artculo se supone que est familiarizado con los temas siguientes:

Visual Basic .NET Acceso a los datos de ADO.NET

Volver al principio

Crear el proyecto y agregar cdigo

1.
2.

Inicie Visual Studio .NET y cree un nuevo proyecto de aplicacin para Windows de Visual Basic. Agregar una referencia a System.Data.SqlClient agregando la lnea siguiente al principio de su archivo de Form1.vb:

3. Imports System.Data.SqlClient
4. Arrastre un control TreeView (Treeview1) desde el cuadro de herramientas hasta el formulario (Form1).

5.

Abra la ventana de cdigo del formulario y, a continuacin, pegue el cdigo siguiente en el evento Form1_Load : Nota Debe reemplazar USER ID < nombre de usuario > y < contrasea > de la contrasea con los valores correctos. Asegrese de que el identificador de usuario tiene los permisos adecuados realizar estas operaciones en la base de datos.

6. 7.

Dim DSNWind As DataSet Dim CNnwind As New SqlClient.SqlConnection("DATA SOURCE=servername;USER ID=<username>;PASSWORD=<strong password>;INITIAL CATALOG=northwind;") '<==== CHANGE HERE

8.

Dim DACustomers As New SqlClient.SqlDataAdapter("SELECT CustomerID, CompanyName, ContactName, Country FROM customers WHERE country = 'Germany'", CNnwind)

9.

Dim DAOrders As New SqlClient.SqlDataAdapter("SELECT CustomerID, OrderID, OrderDate, ShippedDate, ShipVia, Freight FROM orders where customerid in (select customerid from customers where country = 'Germany')", CNnwind)

10.

Dim DAOrderDetails As New SqlClient.SqlDataAdapter("Select * from [Order Details] where OrderID in (SELECT OrderID FROM orders where customerid in (select customerid from customers where country = 'Germany'))", CNnwind)

11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 'Create a data relation object to facilitate the relationship between the Customers and Orders data tables. DSNWind.Relations.Add("CustToOrd", DSNWind.Tables("dtCustomers").Columns("CustomerID"), DSNWind.Tables("dtOrders").Columns("CustomerID")) DSNWind = New DataSet() CNnwind.Open() DACustomers.Fill(DSNWind, "dtCustomers") DAOrders.Fill(DSNWind, "dtOrders") DAOrderDetails.Fill(DSNWind, "dtOrderDetails") 'Close the connection to the data store; free up the resources CNnwind.Close()

22.

DSNWind.Relations.Add("OrdToDet", DSNWind.Tables("dtOrders").Columns("OrderID"), DSNWind.Tables("dtOrderdetails").Columns("OrderID"))

23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.

''''''''''''''''''''''' TreeView1.Nodes.Clear() Dim i, n As Integer Dim parentrow As DataRow Dim ParentTable As DataTable ParentTable = DSNWind.Tables("dtCustomers") For Each parentrow In ParentTable.Rows Dim parentnode As TreeNode parentnode = New TreeNode(parentrow.Item(0)) TreeView1.Nodes.Add(parentnode) ''''populate child''''' ''''''''''''''''''''''' Dim childrow As DataRow Dim childnode As TreeNode childnode = New TreeNode() For Each childrow In parentrow.GetChildRows("CustToOrd") childnode = parentnode.Nodes.Add(childrow(0) & " " & childrow(1) & " " & childrow(2)) childnode.Tag = childrow("OrderID") ''''populate child2'''' '''''''''''''''''''''''''' Dim childrow2 As DataRow Dim childnode2 As TreeNode childnode2 = New TreeNode() For Each childrow2 In childrow.GetChildRows("OrdToDet") childnode2 = childnode.Nodes.Add(childrow2(0)) Next childrow2 '''''''''''''''''''''''' Next childrow '''''''''''''''

55.

Next parentrow

EJEMPLO 4 ES BUENO http://msdn.microsoft.com/es-es/library/7a9swst5(VS.80).aspx

EJEMPLO5

Introduccin:
Cuando seleccionas un nodo en un TreeView, el valor de la propiedad FullPath contiene una cadena al estilo de Nodo_Padre\Nodo_Hijo\Nodo_Nieto, es decir, te devuelve el "path" o ruta de ese nodo al estilo de los directorios. Aqu te voy a explicar cmo aprovechar esa forma de mostrar la ruta de un nodo en concreto, con idea de que puedas usarlo para seleccionar el nodo del TreeView que quieras en cualquier momento y sin necesidad de tener que recorrerlos todos para llegar al que te interesa. El truco para hacer esto que te digo consiste en agregar las claves de los nodos para que tengan ese mismo contenido, es decir, en lugar de dejar que sea el propio runtime el que asigne los valores a las claves de los nodos, nosotros los asignaremos, pero para que despus nos sirva para esto que te acabo de comentar al principio de este prrafo. Despus para buscar el nodo que coincide con el texto, usamos el mtodo Find, el cual devuelve un array del tipo TreeNode, pero que en la mayora de los casos, solo usaremos el primer elemento del array devuelto por ese mtodo. En el siguiente cdigo (para Visual Basic es el mostrado en el artculo, para C# lo puedes ver ms abajo) te muestro cmo crear esas claves, y como podrs comprobar, consiste en darle a los nodos hijos (sub nodos) la misma clave que al padre, pero aadindole tambin la clave del hijo. Esas claves en realidad se van formando con el texto mostrado. Por supuesto, este truco solo es vlido si no habr repeticiones de claves, es decir, no habr dos nombres iguales en la misma rama del rbol... la situacin ms parecida es la indicada de igualar esto a la estructura de un directorio, en la que no puede haber dos nombres iguales en un mismo directorio (nodo).
' Para sacar valores aleatorios Private rnd As New Random Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As EventArgs) _ Handles MyBase.Load

' Aadir nodos al TreeView ' y asignarles claves para que tengan el mismo valor ' que lo que devuelve FullPath With TreeView1 For i As Integer = 1 To 10 Dim skNodo As String = "Nodo " & i.ToString("00") Dim tvn As TreeNode = .Nodes.Add(skNodo, "Nodo " & i.ToString("00")) For j As Integer = 1 To rnd.Next(2, 5) ' un valor de 2 a 4 Dim skHijo As String = skNodo & "\Hijo " & j.ToString Dim tvn2 As TreeNode = tvn.Nodes.Add(skHijo, "Hijo " & j.ToString) For k As Integer = 1 To rnd.Next(2, 4) ' un valor de 2 a 3 Dim skNieto As String = skHijo & "\Nieto " & k.ToString tvn2.Nodes.Add(skNieto, "Nieto " & k.ToString) Next Next Next End With End Sub

Despus, para seleccionar uno de los nodos sabiendo el "path completo" lo puedes hacer de esta forma (en el cdigo tienes los comentarios para que sepas lo que se hace exactamente):
Private Sub btnSeleccionar_Click(ByVal sender As Object, _ ByVal e As EventArgs) _ Handles btnSeleccionar.Click If String.IsNullOrEmpty(TextBox2.Text) Then Exit Sub ' El nodo a seleccionar Dim sKey As String = TextBox2.Text ' El mtodo Find devuelve un array del tipo TreeNode ' pero normalmente tendr solo un valor si el nodo existe Dim tvn() As TreeNode = TreeView1.Nodes.Find(sKey, True) If tvn IsNot Nothing AndAlso tvn.Length > 0 Then TreeView1.SelectedNode = tvn(0) End If End Sub

Si en cualquier momento quieres conocer el valor devuelto por la propiedad FullPath al seleccionar un nodo, lo puedes hacer con este mtodo que intercepta el evento AfterSelect.
' Cuando se selecciona un nodo del TreeView Private Sub TreeView1_AfterSelect(ByVal sender As Object, _ ByVal e As TreeViewEventArgs) _ Handles TreeView1.AfterSelect ' Mostrar en el textBox el path completo

TextBox1.Text = e.Node.FullPath 'TextBox2.Text = e.Node.FullPath End Sub

Para crear este ejemplo, necesitas lo siguiente:


Un control TreeView llamado TreeView1 Dos cajas de texto (TextBox), una llamada TextBox1 y la otra TextBox2 Un botn llamado btnSeleccionar Si usas C#, tendrs que interceptar estos eventos: o o o El evento Load del formulario en el mtodo Form_Load El evento Click del botn en el mtodo btnSeleccionar_Click El Evento AfterSelect del TreeView en el mtodo TreeView1_AfterSelect

Despus inserta todo el cdigo mostrado en el formulario y ya tienes el ejemplo funcionando. Ms abajo tienes el cdigo para C# y los ZIP con los proyectos, tanto para Visual Basic 2008 como para Visual C# 2008. Pero aunque esos proyectos estn creados con Visual Studio 2008, tambin te valdrn para Visual Studio 2005. Espero que te sea de utilidad. Nos vemos. Guillermo
EJEMPLO 7 http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visualbasic/180-cargar-base-dato-treeview.htm

You might also like