36- . Aplicaciones web. SQL Parte 4 y TreeView
- En este capítulo del curso de programación en c# con visual studio 2017,continuamos con un poco de SQL SERVER y además veremos como cargar el control Treeview a partir de los productos que tenemos almacenados en nuestra base de datos de pruebas.- Normalmente el control TreeView se compone de uno o varios nodos. Cada entrada del árbol se denomina nodo y se representa mediante un objeto TreeNode. Tenemos tres tipos de nodos:
- Raiz: Nodo que no tiene ningún nodo primario y tiene uno o varios nodos secundarios.
- Principal: Un nodo que tiene un nodo primario y uno o varios nodos secundarios.
- Hoja: Un nodo que no tiene ningún nodo secundario.
- Os dejo el código paso a paso de lo mostrado en el video:
- Primero cargamos nuestra tabla de productos.En ella definmos 7 productos padre de los que colgaran el resto de productos.
- En segundo lugar nos creamos un procedimiento almacenado y una función que nos permita recuperar los datos de la manera adecuada para el control TreeView. Este es el código de ambos:
CREATE PROCEDURE [dbo].[DameHijosArbolPorProducto]
@idProducto int=NULL
AS
BEGIN
SET NOCOUNT ON;
IF(@idProducto is NULL)
BEGIN
SELECT IdProducto,Nombre FROM PRODUCTOS WHERE idPAdre IS NULL
END
ELSE
BEGIN
DECLARE @TablaTemp2 TABLE(IdTemp int NOT NULL)
INSERT INTO @TablaTemp2 SELECT * FROM DameIdHijos(@idProducto)
SELECT IdProducto,Nombre,idPadre FROM @TablaTemp2 as tabla
INNER JOIN PRODUCTOS ON Productos.IdProducto = tabla.IdTemp and idPadre is not null
END
END
* Función:
ALTER FUNCTION [dbo].[DameIdHijos](@IdPadre int)
RETURNS @Tabla TABLE (IdTemp int NOT NULL)
AS
BEGIN
DECLARE @TablaTemp2 TABLE(IdTemp int NOT NULL, Analizado bit)
-- Si no se especifica un IdPadre entonces ERROR. Devolvemos NADA
IF @IdPadre is null
BEGIN
RETURN
END
DECLARE @IdPadreTemp int
INSERT INTO @TablaTemp2 SELECT IdProducto,0 FROM PRODUCTOS WITH (NOLOCK) WHERE IdProducto=@IdPadre OR IdProducto=@IdPadre
SELECT TOP 1 @IdPadreTemp=IdTemp FROM @TablaTemp2 WHERE Analizado=0 ORDER BY IdTemp
WHILE NOT @IdPadreTemp IS NULL
BEGIN
SET @IdPadreTemp=NULL
SELECT TOP 1 @IdPadreTemp=IdTemp FROM @TablaTemp2 WHERE IdTemp IN (SELECT DISTINCT IdPadre FROM PRODUCTOS WITH (NOLOCK) WHERE IdPadre IN (SELECT IdTemp FROM @TablaTemp2 WHERE Analizado=0) AND Analizado=0)
IF not @IdPadreTemp is null
BEGIN
INSERT INTO @TablaTemp2 SELECT IdProducto,0 FROM PRODUCTOS WITH (NOLOCK) WHERE IdPadre=@IdPadreTemp
UPDATE @TablaTemp2 SET Analizado=1 WHERE IdTemp=@IdPadreTemp
END
END
INSERT INTO @Tabla (IdTemp)
SELECT DISTINCT IdTemp FROM @TablaTemp2
RETURN
END
- En tercer lugar necesitamos llamar a nuestro procedimiento almacenado desde nuestra página web para cargar los datos en nuestro TreeView.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Pedidos.aspx.cs" Inherits="GestionVarios.Pedidos" MasterPageFile="~/Master.Master" %>
<asp:Content ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div style="background-color:#FFFFFF">
<asp:TreeView ID="treeViewProductos" runat="server"></asp:TreeView>
</div>
</asp:Content>
* Código de la parte de servidor:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace GestionVarios
{
public partial class Pedidos : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
InicializarDatos();
}
}
private void InicializarDatos()
{
SqlConnection Con = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);
try
{
Con.Open();
SqlCommand Com = Con.CreateCommand();
Com.CommandText = "DameHijosArbolPorProducto";
Com.CommandType = CommandType.StoredProcedure;
SqlDataReader Rst = Com.ExecuteReader();
int i = 0;
while (Rst.Read())
{
treeViewProductos.Nodes.Add(new TreeNode());
treeViewProductos.Nodes[i].Text = Rst["Nombre"].ToString();
treeViewProductos.Nodes[i].Value = Rst["IdProducto"].ToString();
cargarHijos(Rst["IdProducto"].ToString(),i);
i++;
}
Rst.Close();
//Expande todos los nodos
treeViewProductos.ExpandAll();
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
finally
{
if (Con.State == ConnectionState.Open)
Con.Close();
Con.Dispose();
}
}
private void cargarHijos(string idProducto,int posicionNodo)
{
SqlConnection Con = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);
string IdPadre = String.Empty;
IdPadre = idProducto;
try
{
Con.Open();
SqlCommand Com = Con.CreateCommand();
Com.CommandText = "DameHijosArbolPorProducto";
Com.CommandType = CommandType.StoredProcedure;
Com.Parameters.Add("@idProducto", SqlDbType.Int).Value = idProducto;
SqlDataReader Rst = Com.ExecuteReader();
while (Rst.Read())
{
TreeNode Tn = new TreeNode();
Tn.Text = Rst["Nombre"].ToString();
Tn.Value = Rst["IdProducto"].ToString();
if (Rst["IdPadre"].ToString() != IdPadre)
{
TreeNode Padre = DameNodoPorId(treeViewProductos.Nodes[posicionNodo], Rst["IdPadre"].ToString());
Padre.ChildNodes.Add(Tn);
}
else
{
treeViewProductos.Nodes[posicionNodo].ChildNodes.Add(Tn);
}
}
Rst.Close();
Com.Dispose();
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
finally
{
if (Con.State == ConnectionState.Open)
Con.Close();
Con.Dispose();
}
}
private TreeNode DameNodoPorId(TreeNode Nodo, string Id)
{
if (Nodo.Value == Id)
return Nodo;
for (int i = 0; i < Nodo.ChildNodes.Count; i++)
{
if (Nodo.ChildNodes[i].Value == Id)
return Nodo.ChildNodes[i];
TreeNode RetNodo = DameNodoPorId(Nodo.ChildNodes[i], Id);
if (RetNodo != null)
return RetNodo;
}
return null;
}
}
}
No hay comentarios:
Publicar un comentario