Pop

42-. Aplicaciones web.Guardar Pedidos(5).Curso de C# con Visual Studio 2017.

42-. Aplicaciones web.Guardar Pedidos.Carrito de compra(5)

   - En este capítulo del curso de programación en c# con visual studio 2017,vamos a finalizar nuestro ejemplo del carrito de compra.Para ello vamos  guardar en nuestra base de datos los pedidos que un usuario previamente logado en la web hace una vez desde la página.

- Os dejo un una imagen con el diseño de las tablas de nuestra base de datos ya que hemos añadido el campo cantidad a nuestra tabla Pedidos_Lineas:

- Como podéis ver en el video siguiente, además de un botón para finalizar la compra hemos añadido un botón para limpiar nuestro carrito de la compra.El botón finalizar compra llama a un procedimiento almacenado que guarda en nuestra base datos el pedido con todos sus productos asociados. El botón limpiar carro borra todos los articulos que tengamos en el carrito.



- Os dejo el código de lo visto en el video y un enlace a Microsoft para que sepáis cuando usar la función identity de SQL.

  • Procedimento almacenado SQL:
 ALTER PROCEDURE [dbo].[GuardarPedido]
    @idUsuario int ,
    @Lista AS dbo.ListaProductosCompra READONLY 
AS
BEGIN


        DECLARE @TablaTemp2 TABLE(IdTemp int NOT NULL, cantidad int)
        INSERT INTO @TablaTemp2 SELECT idprodcuto,cantidad FROM @lista

        --INSERTAMOS  EN TABLA PEDIDOS
        DECLARE @idpedidoAux int
        INSERT INTO dbo.Pedidos (IdUsuario,FechaPedido) VALUES (@idUsuario ,GETDATE() )
        SET @idpedidoAux =  @@IDENTITY
   
        --INSERTAMOS EN TABLA LINEAS PEDIDOS
           INSERT INTO Pedido_Lineas
          SELECT @idpedidoAux,* FROM @TablaTemp2
END

  • Código de la página Pedidos.aspx:

<%@ 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">
        <div runat="server" id="divProductos">
            <table>
                <tr>
                    <td align="left" width="30%">
                        <asp:TreeView ID="treeViewProductos" runat="server" OnSelectedNodeChanged="treeViewProductos_SelectedNodeChanged"></asp:TreeView>

                    </td>
                    <td align="center" width="50%">

                        <asp:Label ID="lblNombreProducto" runat="server"></asp:Label><br />
                        <asp:Label ID="lblDescripcion" runat="server"></asp:Label><br />
                        <asp:Label ID="lblPrecioDeCompra" runat="server"></asp:Label><br />
                        <asp:Label ID="lblCantidad" runat="server" Text="Unidades:" Visible="false"></asp:Label>
                        <asp:TextBox runat="server" ID="txtUnidades" Width="40px" Visible="false"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="mreqEMail" runat="server" ControlToValidate="txtUnidades" ErrorMessage="*" Display="Dynamic" ForeColor="Red"></asp:RequiredFieldValidator><br />
                        <asp:RegularExpressionValidator ID="mregEMail" runat="server" ControlToValidate="txtUnidades" ErrorMessage="Introduzca un numero" ValidationExpression="^\d+$" Display="Dynamic" ForeColor="Red"></asp:RegularExpressionValidator>


                    </td>
                    <td width="20%">

                        <asp:Button ID="btnAgregar" runat="server" Text="Agregar al carro" Visible="false" OnClick="btnAgregar_Click" />

                    </td>
                    <td width="20%">

                        <asp:Button ID="btnVerCompra" runat="server" Text="Ver carro compra" OnClick="btnVerCompra_Click" Visible="false" />

                    </td>

                </tr>

            </table>
        </div>
        <div runat="server" id="divListaCompra" visible="false" align="center">
            <table>
                <tr>
                    <td align="center">
                        <asp:GridView ID="GridView1" runat="server"></asp:GridView>
                    </td>
                </tr>
                <tr>
                    <td>
                        <br />
                        <asp:Button ID="btnFinalizarCompra" runat="server" Text="Finalizar compra" OnClick="btnFinalizarCompra_Click" />&nbsp;&nbsp;
                    <asp:Button ID="btnLimpiarCarro" runat="server" Text="Vaciar carro" OnClick="btnLimpiarCarro_Click" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <br />
                        <asp:Label runat="server" ID="lblResultado"></asp:Label>
                    </td>
                </tr>
            </table>
        </div>
    </div>
</asp:Content>

  • Código de la página Pedidos.aspx.cs:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
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
    {
        private ArrayList productosSeleccionados = new ArrayList();
             
      
        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.CollapseAll();//.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;
        }

        protected void treeViewProductos_SelectedNodeChanged(object sender, EventArgs e)
        {
            TreeNode nodo = treeViewProductos.SelectedNode;
            CargarDatosProducto(nodo.Value);
            btnAgregar.Visible = true;
            txtUnidades.Visible = true;
            lblCantidad.Visible = true;
        }

        private void CargarDatosProducto(string idProducto)
        {
            SqlConnection Con = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);

            try
            {
                Con.Open();
                SqlCommand Com = Con.CreateCommand();
                Com.CommandText = "DameDatosProducto";
                Com.CommandType = CommandType.StoredProcedure;
                Com.Parameters.Add("@idProducto", SqlDbType.Int).Value = idProducto;
                SqlDataReader Rst = Com.ExecuteReader();


                while (Rst.Read())
                {
                    lblDescripcion.Text = "Detalles producto" + Rst["Descripcion"].ToString();
                    lblNombreProducto.Text = "Producto: " + Rst["Nombre"].ToString();
                    lblPrecioDeCompra.Text = "Precio por unidad:" + Rst["PrecioVenta"].ToString() + " € ";
                }

                Rst.Close();
                Com.Dispose();


            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
            finally
            {
                if (Con.State == ConnectionState.Open)
                    Con.Close();
                Con.Dispose();
            }
        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {

            btnVerCompra.Visible = true;
            TreeNode nodo = treeViewProductos.SelectedNode;
            productosSeleccionados.Add(nodo.Value);
            productosSeleccionados.Add(txtUnidades.Text);
        
        }


        protected override void LoadViewState(object savedState)
        {
           base.LoadViewState(savedState);
           this.productosSeleccionados = (ArrayList)this.ViewState["productosCarro"];
        }


        protected override object SaveViewState()
        {
            this.ViewState.Add("productosCarro", productosSeleccionados);

            return base.SaveViewState();

        }

        protected void btnVerCompra_Click(object sender, EventArgs e)
        {
           ArrayList productos = this.productosSeleccionados;


            DataTable dt = ProductosDatatable(productos);

            CargarListaProducto(dt);
            divListaCompra.Visible = true;
            divProductos.Visible = false;

        }

        private void CargarListaProducto(DataTable productos)
        {
            SqlConnection Con = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);

            try
            {
                Con.Open();
                SqlCommand Com = Con.CreateCommand();
                Com.CommandText = "DameDatosProductos";
                Com.CommandType = CommandType.StoredProcedure;
                Com.Parameters.Add("@Lista", SqlDbType.Structured).Value = productos;
                SqlDataReader Rst = Com.ExecuteReader(CommandBehavior.CloseConnection);

                GridView1.DataSource = Rst;
                GridView1.DataBind();
            

            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
            finally
            {
                if (Con.State == ConnectionState.Open)
                    Con.Close();
                Con.Dispose();
            }
        }

        protected void btnLimpiarCarro_Click(object sender, EventArgs e)
        {
            productosSeleccionados = new ArrayList();
            divProductos.Visible = true;
            divListaCompra.Visible = false;
        }

        protected void btnFinalizarCompra_Click(object sender, EventArgs e)
        {
            lblResultado.Visible = false;
            if (productosSeleccionados.Count > 0)
            {
                ArrayList productos = this.productosSeleccionados;
                DataTable dt = ProductosDatatable(productos);
                SqlConnection Con = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);

                try
                {
                    Con.Open();
                    SqlCommand Com = Con.CreateCommand();
                    Com.CommandText = "GuardarPedido";
                    Com.CommandType = CommandType.StoredProcedure;
                    Com.Parameters.Add("@idUsuario", SqlDbType.Int).Value = this.Page.User.Identity.Name;
                    Com.Parameters.Add("@Lista", SqlDbType.Structured).Value = dt;
                    Com.ExecuteNonQuery();

                    lblResultado.Text = "Pedido finalizado correctamente";
                    lblResultado.ForeColor = Color.Green;
                    lblResultado.Visible = true;

                }
                catch (Exception ex)
                {
                    lblResultado.Text = ex.Message;
                    lblResultado.ForeColor = Color.Red;
                    lblResultado.Visible = true;
                }
                finally
                {
                    if (Con.State == ConnectionState.Open)
                        Con.Close();
                    Con.Dispose();
                }
            }
            else
            {
                lblResultado.Text = "Seleccione algun producto";
                lblResultado.ForeColor = Color.Red;
                lblResultado.Visible = true;
           
            }

        }

        private DataTable ProductosDatatable(ArrayList productos)
        {

            DataTable dt = new DataTable();
            dt.Columns.Add("idProducto");
            dt.Columns.Add("Cantidad");

            for (int i = 0; i < productos.Count; i = i + 2)
                dt.Rows.Add(productos[i], productos[i + 1]);

            return dt;
        }
    }
}

41-. Aplicaciones web.GridView.Carrito de compra(4).Curso de C# con Visual Studio 2017.

41-. Aplicaciones web.GridView.Carrito de compra(4)

   - En este capítulo del curso de programación en c# con visual studio 2017,vamos a utilizar el control GridView y el objeto DataTable. En el objeto DataTable iremos almacenando los productos y las cantidades seleccionadas, para posteriormente validar contra nuestra base de datos que estos productos existen.Una vez comprobado que estos productos existen los mostramos al usuario en el control GridView 

-   Os dejo unas pinceladas de estos dos controles y unos enlaces a la MSDN:

  • DataTable: Un objeto DataTable representa una tabla de datos relacionales de la memoria; los datos son locales de la aplicación basada en .NET en la que residen, pero se pueden llenar desde un origen de datos como Microsoft SQL Server.(Más información)

  • GridView:Muestra los valores de un origen de datos en una tabla en la que cada columna representa un campo y cada fila representa un registro. El control GridView le permite seleccionar, ordenar y editar estos elementos.(Más información)
  

-  Os dejo el código SQL y el código de la página de la aplicación vista en el video:

  • Procedimiento alamcenado SQL al que llamamamos para cargar el Gridview:
CREATE PROCEDURE [dbo].[DameDatosProductos]
   
    @Lista AS dbo.ListaProductosCompra READONLY
AS
BEGIN



        DECLARE @TablaTemp2 TABLE(IdTemp int NOT NULL, cantidad int)
        INSERT INTO @TablaTemp2 SELECT idprodcuto,cantidad FROM @lista

        SELECT IdProducto,Nombre,PrecioVenta,t.cantidad,Descripcion
        FROM Productos
        INNER JOIN @TablaTemp2 as t ON t.IdTemp = Productos.idproducto
      
 END

  •  Código de la página pedidos.aspx:
 <%@ 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">
        <table>
            <tr>
                <td align="left" width="30%">
                    <asp:TreeView ID="treeViewProductos" runat="server" OnSelectedNodeChanged="treeViewProductos_SelectedNodeChanged"></asp:TreeView>

                </td>
                <td align="center"  width="50%">
                   
                    <asp:Label ID="lblNombreProducto" runat="server"></asp:Label><br />
                    <asp:Label ID="lblDescripcion" runat="server"></asp:Label><br />
                    <asp:Label ID="lblPrecioDeCompra" runat="server"></asp:Label><br />
                    <asp:Label ID="lblCantidad" runat="server" Text="Unidades:" Visible="false"></asp:Label>
                    <asp:TextBox runat="server" ID="txtUnidades" Width="40px" Visible="false"></asp:TextBox>
                      <asp:RequiredFieldValidator ID="mreqEMail" runat="server" ControlToValidate="txtUnidades" ErrorMessage="*" Display="Dynamic" ForeColor="Red"  ></asp:RequiredFieldValidator><br />
                    <asp:RegularExpressionValidator ID="mregEMail" runat="server" ControlToValidate="txtUnidades" ErrorMessage="Introduzca un numero" ValidationExpression="^\d+$" Display="Dynamic"  ForeColor="Red"></asp:RegularExpressionValidator>
      
                  
                </td>
                <td  width="20%">

                    <asp:Button id="btnAgregar" runat="server" Text="Agregar al carro" Visible="false" OnClick="btnAgregar_Click"/>
                 
                </td>
                   <td  width="20%">

                     <asp:Button ID="btnVerCompra" runat="server" Text="Ver carro compra" OnClick="btnVerCompra_Click"  Visible="false"/>
                 
                </td>

            </tr>
        </table>
        <table>
            <tr>
                <td align="center">
                    <asp:GridView ID="GridView1" runat="server" ></asp:GridView>
               </td>
            </tr>
        </table>
    </div>
</asp:Content>


  •  Código de la página pedidos.aspx.cs:

using System;
using System.Collections;
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
    {
        private ArrayList productosSeleccionados = new ArrayList();
             
      
        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.CollapseAll();//.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;
        }

        protected void treeViewProductos_SelectedNodeChanged(object sender, EventArgs e)
        {
            TreeNode nodo = treeViewProductos.SelectedNode;
            CargarDatosProducto(nodo.Value);
            btnAgregar.Visible = true;
            txtUnidades.Visible = true;
            lblCantidad.Visible = true;
        }

        private void CargarDatosProducto(string idProducto)
        {
            SqlConnection Con = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);

            try
            {
                Con.Open();
                SqlCommand Com = Con.CreateCommand();
                Com.CommandText = "DameDatosProducto";
                Com.CommandType = CommandType.StoredProcedure;
                Com.Parameters.Add("@idProducto", SqlDbType.Int).Value = idProducto;
                SqlDataReader Rst = Com.ExecuteReader();


                while (Rst.Read())
                {
                    lblDescripcion.Text = "Detalles producto" + Rst["Descripcion"].ToString();
                    lblNombreProducto.Text = "Producto: " + Rst["Nombre"].ToString();
                    lblPrecioDeCompra.Text = "Precio por unidad:" + Rst["PrecioVenta"].ToString() + " € ";
                }

                Rst.Close();
                Com.Dispose();


            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
            finally
            {
                if (Con.State == ConnectionState.Open)
                    Con.Close();
                Con.Dispose();
            }
        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {

            btnVerCompra.Visible = true;
            TreeNode nodo = treeViewProductos.SelectedNode;
            productosSeleccionados.Add(nodo.Value);
            productosSeleccionados.Add(txtUnidades.Text);
        
        }


        protected override void LoadViewState(object savedState)
        {
           base.LoadViewState(savedState);
           this.productosSeleccionados = (ArrayList)this.ViewState["productosCarro"];
        }


        protected override object SaveViewState()
        {
            this.ViewState.Add("productosCarro", productosSeleccionados);

            return base.SaveViewState();

        }

        protected void btnVerCompra_Click(object sender, EventArgs e)
        {
           ArrayList productos = this.productosSeleccionados;
          
           DataTable dt = new DataTable();
           dt.Columns.Add("idProducto");
           dt.Columns.Add("Cantidad");

            for (int i = 0; i < productos.Count; i=i+2)
              dt.Rows.Add(productos[i], productos[i + 1]);
           

            CargarListaProducto(dt);

        }

        private void CargarListaProducto(DataTable productos)
        {
            SqlConnection Con = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);

            try
            {
                Con.Open();
                SqlCommand Com = Con.CreateCommand();
                Com.CommandText = "DameDatosProductos";
                Com.CommandType = CommandType.StoredProcedure;
                Com.Parameters.Add("@Lista", SqlDbType.Structured).Value = productos;
                SqlDataReader Rst = Com.ExecuteReader(CommandBehavior.CloseConnection);

                GridView1.DataSource = Rst;
                GridView1.DataBind();
            

            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
            finally
            {
                if (Con.State == ConnectionState.Open)
                    Con.Close();
                Con.Dispose();
            }
        }
    }
}

40-. Aplicaciones web. ViewState.Carrito de compra(3).Curso de C# con Visual Studio 2017.

40-. Aplicaciones web. ViewState.Carrito de compra(3)

  - En este capítulo del curso de programación en c# con visual studio 2017,vamos empezar a utilizar el ViewState. Lo utilizaremos para almacenar los productos seleccionados por el usuario en cada petición al servidor.Si no utlizaramos este u otro mecanismo en cada ida y vuelta perderiamos los datos.

-  Para comprender el funcionamiento de los métodos explicados en el video, es necesario conocer el ciclo de vida de una página,que ya fue explicado en entradas anteriores.Como podeís ver en la imagen.  los datos del ViewState se cargan antes de pasar por el evento Load y se guardan antes de renderizar la página. Como los métodos que cargan y guardan el ViewState permiten ser sobreescritos utilizando el modificador override los modificamos para guardar y cargar los prodcutos que el usaurio vaya seleccionando.


 - Una vez comprendido en que momentos se llaman a los métodos que utilizan el ViewsState os dejo el video donde utilizo este mecanismo:


- Os dejo un enlace a la MSDN para completar la información:https://msdn.microsoft.com/es-es/library/bb386448(v=vs.100).aspx

- También os dejo el código de lo visto en en el video:

  • Código de la página Pedido.aspx:

<%@ 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">
        <table>
            <tr>
                <td align="left" width="30%">
                    <asp:TreeView ID="treeViewProductos" runat="server" OnSelectedNodeChanged="treeViewProductos_SelectedNodeChanged"></asp:TreeView>

                </td>
                <td align="center"  width="50%">
                   
                    <asp:Label ID="lblNombreProducto" runat="server"></asp:Label><br />
                    <asp:Label ID="lblDescripcion" runat="server"></asp:Label><br />
                    <asp:Label ID="lblPrecioDeCompra" runat="server"></asp:Label><br />
                    <asp:Label ID="lblCantidad" runat="server" Text="Unidades:" Visible="false"></asp:Label>
                    <asp:TextBox runat="server" ID="txtUnidades" Width="40px" Visible="false"></asp:TextBox>
                      <asp:RequiredFieldValidator ID="mreqEMail" runat="server" ControlToValidate="txtUnidades" ErrorMessage="*" Display="Dynamic" ForeColor="Red"  ></asp:RequiredFieldValidator><br />
                    <asp:RegularExpressionValidator ID="mregEMail" runat="server" ControlToValidate="txtUnidades" ErrorMessage="Introduzca un numero" ValidationExpression="^\d+$" Display="Dynamic"  ForeColor="Red"></asp:RegularExpressionValidator>
      
                  
                </td>
                <td  width="20%">

                    <asp:Button id="btnAgregar" runat="server" Text="Agregar al carro" Visible="false" OnClick="btnAgregar_Click"/>
                 
                </td>
                   <td  width="20%">

                     <asp:Button ID="btnVerCompra" runat="server" Text="Ver carro compra" OnClick="btnVerCompra_Click"  Visible="false"/>
                 
                </td>
           </tr>
        </table> 
   </div>
</asp:Content>

  •  Código de la página Pedido.aspx.cs
 using System;
using System.Collections;
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
    {
        private ArrayList productosSeleccionados = new ArrayList();
            
     
        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.CollapseAll();//.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;
        }

        protected void treeViewProductos_SelectedNodeChanged(object sender, EventArgs e)
        {
            TreeNode nodo = treeViewProductos.SelectedNode;
            CargarDatosProducto(nodo.Value);
            btnAgregar.Visible = true;
            txtUnidades.Visible = true;
            lblCantidad.Visible = true;
        }

        private void CargarDatosProducto(string idProducto)
        {
            SqlConnection Con = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);

            try
            {
                Con.Open();
                SqlCommand Com = Con.CreateCommand();
                Com.CommandText = "DameDatosProducto";
                Com.CommandType = CommandType.StoredProcedure;
                Com.Parameters.Add("@idProducto", SqlDbType.Int).Value = idProducto;
                SqlDataReader Rst = Com.ExecuteReader();


                while (Rst.Read())
                {
                    lblDescripcion.Text = "Detalles producto" + Rst["Descripcion"].ToString();
                    lblNombreProducto.Text = "Producto: " + Rst["Nombre"].ToString();
                    lblPrecioDeCompra.Text = "Precio por unidad:" + Rst["PrecioVenta"].ToString() + " € ";
                }

                Rst.Close();
                Com.Dispose();


            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
            finally
            {
                if (Con.State == ConnectionState.Open)
                    Con.Close();
                Con.Dispose();
            }
        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {

            btnVerCompra.Visible = true;
            TreeNode nodo = treeViewProductos.SelectedNode;
            productosSeleccionados.Add(nodo.Value);
            productosSeleccionados.Add(txtUnidades.Text);
       
        }


        protected override void LoadViewState(object savedState)
        {
           base.LoadViewState(savedState);
           this.productosSeleccionados = (ArrayList)this.ViewState["productosCarro"];
        }


        protected override object SaveViewState()
        {
            this.ViewState.Add("productosCarro", productosSeleccionados);

            return base.SaveViewState();

        }

        protected void btnVerCompra_Click(object sender, EventArgs e)
        {
          
        }
    }
}

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...