lunes, agosto 14, 2006

De tabla a TreeView en ASP NET 2.0 (versión 2)

Creamos la tabla donde tenemos la relación padre a hijo infinito para n nodos y con padres sin hijos:

CREATE TABLE [dbo].[Tabla](
[codigo] [int] IDENTITY(1,1) NOT NULL,
[nombre] [varchar](50) NOT NULL,
[padre] [int] NULL
) ON [PRIMARY]

GO

la rellenamos con datos:
INSERT Tabla (nombre)
VALUES('Luis')--sin padre
INSERT Tabla (nombre,padre)
VALUES('Pedro',1)
INSERT Tabla (nombre)
VALUES('Alfonso')
INSERT Tabla (nombre)
VALUES('Jose')
INSERT Tabla (nombre,padre)
VALUES('Fidel', 4)
INSERT Tabla (nombre,padre)
VALUES('Pepe', 2)


dentro de la etiqueta script de un formulario o página ASP incluyes este código:

Dim conex As String = "Data Source=OSCARVAIO;Initial Catalog=Pruebas;Integrated Security=True"
Sub Page_Load()
If Not Page.IsPostBack Then
FillNodes()
End If
End Sub
Sub FillNodes()
Dim ds As DataSet = GetData()
For Each masterRow As DataRow In ds.Tables("Padres").Rows
Dim masterNode As New TreeNode(masterRow("nombre").ToString(), masterRow("codigo").ToString())
If IsDBNull(masterRow("padre")) Then
TreeView1.Nodes.Add(masterNode)
Else
For Each node As TreeNode In TreeView1.Nodes
If node.Value.ToString() = masterRow("codigo").ToString() Then
masterNode = node
Exit For
End If
If node.ChildNodes.Count > 0 Then
Dim NodoEncontrado As TreeNode = BuscarNodo(node, masterRow("codigo").ToString())
If Not NodoEncontrado Is Nothing Then
masterNode = NodoEncontrado
Exit For
End If
End If
Next
End If
For Each childRow As DataRow In masterRow.GetChildRows("Hijo")
Dim childNode As New TreeNode(childRow("nombre").ToString(), childRow("codigo").ToString())
masterNode.ChildNodes.Add(childNode)
Next
Next
End Sub
Function BuscarNodo(ByVal arbol As TreeNode, ByVal codigo As String) As TreeNode
For Each node As TreeNode In arbol.ChildNodes
If node.Value.ToString() = codigo Then
BuscarNodo = node
Exit Function
End If
If node.ChildNodes.Count > 0 Then
BuscarNodo(node, codigo)
End If
Next
BuscarNodo = Nothing
End Function
Function GetData() As DataSet
Dim conn As SqlConnection = New SqlConnection(conex)
Dim sqlCat As StringBuilder = New StringBuilder()
sqlCat.Append("SELECT ISNULL(P1.Codigo,P2.Codigo) AS codigo, ")
sqlcat.Append("ISNULL(P1.nombre,P2.nombre) AS nombre, ")
sqlcat.Append("ISNULL(P1.padre,P2.padre) AS padre ")
sqlcat.Append("FROM ")
sqlCat.Append("(SELECT Tabla.codigo, Tabla.nombre, Tabla.padre ")
sqlcat.Append("FROM Tabla WHERE padre IS NULL) AS P1 ")
sqlcat.Append("FULL JOIN ")
sqlCat.Append("(SELECT T2.* ")
sqlcat.Append("FROM Tabla AS T1 INNER JOIN Tabla AS T2 ON ")
sqlcat.Append("T1.padre=T2.codigo) AS P2 ON ")
sqlcat.Append("P1.Codigo=P2.Codigo ")
sqlcat.Append("ORDER BY codigo ")
Dim sqlProd As String = "SELECT Codigo,Nombre,Padre FROM Tabla AS Hijos WHERE Padre<>''"
Dim daCat As SqlDataAdapter = New SqlDataAdapter(sqlCat.ToString(), conn)
Dim daProd As SqlDataAdapter = New SqlDataAdapter(sqlProd, conn)
Dim ds As DataSet = New DataSet()
daCat.Fill(ds, "Padres")
daProd.Fill(ds, "Hijos")
ds.Relations.Add("Hijo", _
ds.Tables("Padres").Columns("Codigo"), _
ds.Tables("Hijos").Columns("Padre"))
Return ds
End Function


Lo ejecutas y podrás ver como se rellena el treeView.

Esta entrada del blog la he cambiado para completarla para n jerarquías y para padres huérfanos según algunos comentarios recibidos a fecha del '06/09/2008'.

10 comentarios:

aran dijo...

Oscar necesito hacer esto mismo de las listas jerarquicas con WPF, y no entiendo como has creado el comando sql, ¿como se llama la tabla?? supongo que tabla, pero padres que es?' otra tabla??

OscarMontesinos dijo...

Sólo hay una tabla que se llama (Tabla) con los campos Codigo, Nombre, Padre. Padre es un Codigo que referencia a Tabla.Codigo.

En cuanto a WPF, ¿qué tines que hacer exactamente?, aquí llevamos unos meses con WPF y te podríamos ayudar.

Anónimo dijo...

El codigo funciona y es muy interesante, pero ¿como se podría hacer funcionar en un treeview con infinitos subniveles?

OscarMontesinos dijo...

Hola, estoy trabajando en una nueva versión, que permite infinitos subniveles. En breve te la subo.

Anónimo dijo...

hola por casualidad tendras ese codigo para n subniveles me gustaria que me lo compartas mi correo es sean_break@hotmail.com estare en espera de tu respuesta y desde ya te quedo agradecido

OscarMontesinos dijo...

Tengo algo por ahí, esta tarde lo busco y te comento.

OscarMontesinos dijo...

Lo acabo de dejar arreglado para n subniveles y padres sin hijos.

Anónimo dijo...

sera que me puedes mandar la de n subniveles mi mail: kevgeo1234@hotmail.com
gracias

May dijo...

hola mira acabo de ver tu publicación y se me hace muy buena, sólo que tengo un problema en el llenado de los datos, los nodos hijo de mi arbol no aparecen despues del segundo nivel, pero para el primer nodo hijo de la raiz si estas sus hijos, pero para un segundo hijo de raiz su hijos de este no aparecen.

OscarMontesinos dijo...

En teoría tienes que tener un primer nodo raíz, luego a patir de ese raiz tienes que ir colgando todos los demás nodos.

Etiquetas

.net (1) ALGORITMO (4) algoritmos (1) Android (1) angular (2) aplicaciones WEB (1) ARGENTINA (1) ASP (4) asp .NET (1) ASP .NET Identity (1) attach (1) Azure (1) base de datos (1) BINDING (1) BioInformática (2) bootstrap (1) C (2) C# (27) castellano (1) catalán (1) Charla (1) CheckedListBox (1) Clase (1) clausura transitiva (2) CLIENTES (1) Closing (1) Combobox (1) Comisiones (1) CONCURSO (1) condones (1) consultas (1) corrupta (1) CORS OWIN (1) CORS WEB API 2 (1) Criptografía (1) CUENTA NARANJA (1) Custom Control (1) Daniel Seara (1) DATAGRIDVIEW (1) David Salgado (2) dendrograma (6) depurar (1) desarrollo (1) Deserializar (1) DEVCAMP (2) durex (1) e-DNI (1) el Guille (2) Eladio Rincón (1) elGamal (1) encriptación (1) encuesta (1) Entidad (1) ERROR (2) error 3624 (1) España (1) España es nido de víboras. (1) Euclides (1) Euclides extendido (1) evento (1) eventos. (1) factorización (1) factorizar (1) física (1) Framework 2.0 (1) Framework 3.5 (5) Framework 4 (2) Francisco González (1) Francisco Ruiz (1) GO (1) google (1) gossip (1) Grupos de usuarios (1) Guadalajara (1) Guille Comunity Tour (2) Gusenet (9) GUSENET. (1) Huelga informáticos (1) IBEX 35 (1) Idioma (1) IFT (1) IISExpress (1) Indice de Fuerza Tecnica (1) informática (1) Informix (1) ING DIRECT (1) INGDIRECT (1) Ingeniería Informática (2) Inteligencia artificial (5) Intro (1) IOS (1) IPad (1) IPhone (1) IV Aniversario (1) JavaScript (2) JPA (2) keybd_event (1) LA CAIXA (1) La Pineda (1) ladroentidad (1) Lector RSS (2) LINQ (5) LINQ2XML (1) ListBox (1) Live Distributed Objects (1) llenar (1) LOG (1) Madrid .NET (1) MainMenu (1) MAP (1) MAP 2011 (1) MAR DEL PLATA (1) matemáticas (1) Matriculación (1) MDIList (1) MdiWindowsListItem (1) MenuItem (1) MenuStrip (1) Microsoft (18) Microsoft Active Professional (1) Miguel Egea (2) MSDE 2 (1) MSDE 2000 (1) MVVM Light (2) mysql (1) NAMESPACE (1) Needleman (2) NET (1) NS (1) Oferta empleo (1) Office 14 (1) Office 2007 (1) Office 2009 (1) ON ERROR (1) OOB (1) Oscar Montesinos (1) OWIN (1) OWIN Security middleware (1) Paginación (1) PDC (1) Pedro Hurtado (1) PINTARTECA (1) PrinterSettings (1) Process (1) ProcessStartInfo (1) Programador (1) Relacional (1) robo (1) RSS (1) Rubén Garrigós (1) Salvador Ramos (1) Santa Pola (1) scrape (1) scraping (1) ScrollBar (1) Secretaría (1) SendInput (1) SENDKEYS (1) Sergio Vázquez (1) Serializar (1) Silverlight 2.0 (2) Silverlight 4 (1) Silverlight 5 (3) Silverlight. (1) Sindicado (1) Sistema Personal de Trading (3) Sistemas Distribuidos (1) SOLID SUMMIT 2009 (1) SPT (2) SQL Server (3) SQL Server 2000 (2) SQL Server 2005 (2) SQL Server 2008 (3) SQL Server Denali (1) SQL Server Information Services. (1) SQLU (1) SSIS (1) SUMMIT SQL (1) Suspect (1) Syndication (1) TAB (1) Tablas (1) Tarragona (1) Token bearer (1) ToolStripMenuItem (1) ToString() (1) Traductor (1) transacciones (1) treeview (1) truco (1) TRY CATCH (1) UCI (1) Unience (2) Universad (1) Universidad Oberta Catalunya (2) UOC (8) Usuarios. (1) VB (1) VB6 (1) VB9 (1) VIAJAR (1) Vila-seca (1) VISUAL BASIC (3) Visual Basic. (1) visual studio (1) Visual Studio 2005 (1) Visual Studio 2008 (16) Visual Studio 2010 (2) Visual Studio 2013 (1) VS2010 (1) VSTA (1) VSTO (1) WCF (1) WEB API (1) web.config (1) WebClient (1) WF (1) windows (1) Windows 7 (3) Windows 8 (2) Windows Azure (1) Windows pone (1) Windows Server 2008 (1) Windows Vista (1) woff (1) WP7 (1) WPF (1) Wunsch (2) XAML (4) XDocument (1) XElement (1) XML (3) XNA (1) Yield (2)