Pop

36.Aplicaciones web.SQL Parte 4 y Treeview.Curso de C# con Visual Studio 2017.

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.
- En el siguiente video podéis ver como cargar un control  TreeView desde nuestro origen de datos que es nuestra base de datos de pruebas.




 - 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:
                      * Procedimiento almacenado:

 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.
                * Código de la parte cliente:

 <%@ 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

Curso .NET Core en C# - 34.Creamos nuestro propio log

34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...