Pop

48.Servicios Windows.Depurando un servicio. Curso de C# con Visual Studio 2017.

48-.Servicios Windows. Depurando el servicio

   - En este capítulo del curso de programación en c# con visual studio 2017,vamos a continuar con los servicios windows. Hemos implementado una mínima lógica en el servicio windows para probar que una vez instalado en nuestra máquina ejecuta el código y escribe en un fichero en disco cada x segundos.

-Los servicios windows son una buena solución para ejecutar tareas que no requieran interfaz gráfica, ni ninguna interacción con los usuarios y  que tengan como objetivo realizar tareas en un segundo plano.Pero tienen el problema que no se se depurar dando al botón de "Play" del proyecto, aunque  si se puede depurar un servicio de Windows si se inicia el servicio y se asocia el depurador al proceso del servicio. En el video podéis ver como lo asocio:

Como resumen de estos tres capítulos del curso donde hemos trabajado con un servicio windows os dejo lo más importante:

  • Al compilar un servicio windows se genera un ejecutable .exe.
  • Se puede instalar en un sistema windows con la herramienta InstallUtil.exe del framework de microsoft. 
  • Se puede depurar  después de instalarlo asociandolo al proceso correspondiente, desde Visual Studio.

Os dejo el código del ejemplo una vez corregido:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ServciosWindowsPrueba
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            var worker = new Thread(Iniciar);
            worker.Name = "Prueba";
            worker.IsBackground = false;
            worker.Start();
           
        }

        void Iniciar()
        {
            Log l = new Log();
            int milisegundos = 15000;
            try
            {
              
                while (true)
                {
                 
                    l.AddInformationEntry("TODO VA BIEN");
                }
            }
            catch (Exception ex)
            {
                l.AddErrorEntry("error" + ex.ToString());
            }
            finally
            {
                Thread.Sleep(milisegundos);
            }
        }

        protected override void OnStop()
        {

        }
    }
}

47.Servicios Windows.Implementando el servicio. Curso de C# con Visual Studio 2017.

47-.Servicios Windows. Implementando el servicio

   - En este capítulo del curso de programación en c# con visual studio 2017,vamos a continuar con los servicios windows. Vamos a implementar una mínima lógica en el servicio windows para probar que una vez instalado en nuestra máquina ejecuta el código de la misma manera que otras aplicaciones que hemos desarrollado aquí anteriormente, como por ejemplo las aplicaciones de consola.

-Los servicios windows son una buena solución para ejecutar tareas que no requieran interfaz gráfica, ni ninguna interacción con los usuarios y  que tengan como objetivo realizar tareas en un segundo plano.En nuestor ejemplo simplemente vamos a hacer que una vez arrancado el servcio  escriba en un  fichero en disco  cada x segundos.En el video podéis ver el ejemplo.

- En esta ocasión os dejo el código de la clase principal, que se inicia al arrancar el servicio.La parte del código que escribe en un fichero en disco os la dejo a vosotros. De todas formas en entradas anteriores del blog hay ejemplos.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ServciosWindowsPrueba
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            var worker = new Thread(Iniciar);
            worker.Name = "Prueba";
            worker.IsBackground = false;
            worker.Start();
           
        }

        void Iniciar()
        {
            Log l = new Log();
            int milisegundos = 15000;
            try
            {
              
                while (true)
                {
                 
                    l.AddInformationEntry("TODO VA BIEN");
                }
            }
            catch (Exception ex)
            {
                l.AddErrorEntry("error" + ex.ToString());
            }
            finally
            {
                Thread.Sleep(milisegundos);
            }
        }

        protected override void OnStop()
        {

        }
    }
}



  • Os dejo además un par de enlaces a sites de Microsofto con más información sobre los servicios:
  1. https://docs.microsoft.com/es-es/dotnet/framework/windows-services/how-to-install-and-uninstall-services 
  2. https://docs.microsoft.com/es-es/dotnet/framework/windows-services/introduction-to-windows-service-applications

46.Servicios Windows.Introducción. Curso de C# con Visual Studio 2017.

46-.Servicios Windows. Introducción

   - En este capítulo del curso de programación en c# con visual studio 2017,vamos a empezar con los servicios windows. En ocasiones, puede ser que necesitemos cierta funcionalidad  que no necesite una interfaz gráfica y que este siempre corriendo en un segundo plano, para este caso los servicios windows puede ser una buena solucion.

- En el video os muestro como crear un proyecto del tipo windows service, como agregarle de una manera sencilla la capacidad para ser instalado en una máquina y como instalarlo desde línea de comandos con la herramienta installUtil.exe, que tenemos disponible en los diferentes frameworks de Microsoft.NET.


- Como habéis observado en el video una vez compilado el proyecto nos genera un fichero con extensión exe. Este fichero es el que debemos instalar mediante la herramienta installUtil.exe, siguiendo los siguientes pasos:

  1. Primero abrimos un cmd con permisos de administrador.
  2.  Una vez tenemos hecho esto nos vamos a la ruta donde esta la herramienta de instalación que nos proporciona el framework de .net, en nuestro caso esta aquí: 




3. Una vez estemos en la ruta donde esta la herramienta installUtil ejecutamos una sentencia similar a la siguiente para instalar el servicio en nuestra máquina:

  • installutil  ruta_ejecutable\nuestroproyecto.exe  

* Si queremos desinstalar el servicio basta ejecutar la misma senetecia pero añadiendo /u al final.


  • Os dejo además un par de enlaces a sites de Microsofto con más información sobre los servicios:
  1. https://docs.microsoft.com/es-es/dotnet/framework/windows-services/how-to-install-and-uninstall-services 
  2. https://docs.microsoft.com/es-es/dotnet/framework/windows-services/introduction-to-windows-service-applications 

45.Aplicaciones web.Controles ascx.Curso de C# con Visual Studio 2017.

45-.Aplicaciones web.Controles ascx

   - En este capítulo del curso de programación en c# con visual studio 2017,vamos a ver los controles de usuario. En ocasiones, puede ser que necesitemos cierta funcionalidad  que no está incluida en los controles que vienen por defecto incluidos en Visual Studio. En estos casos, podemos crear nuestros propios controles agregando a nuestro proyecto un objeto ascx.

- Un control de usuario es similar a una página Web  (archivo .aspx) e incluye una página de interfaz de usuario y código. El proceso de creación del control de usuario es muy similar al proceso de creación de una página ASP.NET, sólo que al final se agregan el formato y los controles secundarios necesarios.

- En el video os dejo un ejemplo sobre como crear un control ascx y como agregar a una página aspx:



 - Un control de usuario se diferencia de una página Web ASP.NET en los siguientes aspectos:

  • La extensión de nombre de archivo es .ascx.
  • Los controles de usuario no se pueden ejecutar como archivos independientes.
  • El control de usuario no contiene elementos html, body o form. Estos elementos deben estar en la página de alojamiento.
  • Más detalles en: https://msdn.microsoft.com/es-es/library/fb3w5b53(v=vs.100).aspx

- Os dejo también el código del ejemplo visto en el video:

  • Control ascx código cliente:  
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ControlPruebas.ascx.cs" Inherits="GestionVarios.ControlPruebas" %>
<div>
    <asp:Calendar ID="Calendar1" runat="server" OnSelectionChanged="Calendar1_SelectionChanged"></asp:Calendar>
    <asp:TextBox ID="txtPruebas" runat="server" Width="233px"></asp:TextBox>

</div>

  • Control ascx código servidor:  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace GestionVarios
{
    public partial class ControlPruebas : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Calendar1_SelectionChanged(object sender, EventArgs e)
        {
            txtPruebas.Text = Calendar1.SelectedDate.ToShortDateString();
        }
    }
}


  • Codigo de una de las página donde hemos agregado el control:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EjemploControlesVarios.aspx.cs" Inherits="GestionVarios.EjemploControlesVarios" %>

<%@ Register Assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp" %>

<%@ Register src="ControlPruebas.ascx" tagname="ControlPruebas" tagprefix="uc1" %>


<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Calendar ID="Calendar1" runat="server" ></asp:Calendar>
            <asp:Label runat="server" ID="lblMostrar"></asp:Label>
            <asp:Button runat="server" ID="btnClic" Text="Dale" OnClick="btnClic_Click" />
            <br />
            <br />
            <asp:FileUpload ID="fileUpload" runat="server" />
            <asp:Button ID="btnFileUploada" runat="server" Text="Guardar" OnClick="btnFileUploada_Click" />
              <asp:Label runat="server" ID="lblFileupload"></asp:Label>
            <asp:HiddenField ID="HiddenField1" runat="server" />
            <br />
            <br />
              <asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSourcePaises" OnSelectedIndexChanging="ListView1_SelectedIndexChanging" Visible="false">
                  <AlternatingItemTemplate>
                      <span style="background-color: #FAFAD2;color: #284775;">Pais:
                      <asp:Label ID="PaisLabel" runat="server" Text='<%# Eval("Pais") %>' />
                      <br />
                      CodPais:
                      <asp:Label ID="CodPaisLabel" runat="server" Text='<%# Eval("CodPais") %>' />
                      <br />
                      <br />
                      </span>
                  </AlternatingItemTemplate>
                  <EditItemTemplate>
                      <span style="background-color: #FFCC66;color: #000080;">Pais:
                      <asp:TextBox ID="PaisTextBox" runat="server" Text='<%# Bind("Pais") %>' />
                      <br />
                      CodPais:
                      <asp:TextBox ID="CodPaisTextBox" runat="server" Text='<%# Bind("CodPais") %>' />
                      <br />
                      <asp:Button ID="UpdateButton" runat="server" CommandName="Update" Text="Actualizar" />
                      <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="Cancelar" />
                      <br />
                      <br />
                      </span>
                  </EditItemTemplate>
                  <EmptyDataTemplate>
                      <span>No se han devuelto datos.</span>
                  </EmptyDataTemplate>
                  <InsertItemTemplate>
                      <span style="">Pais:
                      <asp:TextBox ID="PaisTextBox" runat="server" Text='<%# Bind("Pais") %>' />
                      <br />
                      CodPais:
                      <asp:TextBox ID="CodPaisTextBox" runat="server" Text='<%# Bind("CodPais") %>' />
                      <br />
                      <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="Insertar" />
                      <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="Borrar" />
                      <br />
                      <br />
                      </span>
                  </InsertItemTemplate>
                  <ItemTemplate>
                      <span style="background-color: #FFFBD6;color: #333333;">Pais:
                      <asp:Label ID="PaisLabel" runat="server" Text='<%# Eval("Pais") %>' />
                      <br />
                      CodPais:
                      <asp:Label ID="CodPaisLabel" runat="server" Text='<%# Eval("CodPais") %>' />
                      <br />
                      <br />
                      </span>
                  </ItemTemplate>
                  <LayoutTemplate>
                      <div id="itemPlaceholderContainer" runat="server" style="font-family: Verdana, Arial, Helvetica, sans-serif;">
                          <span runat="server" id="itemPlaceholder" />
                      </div>
                      <div style="text-align: center;background-color: #FFCC66;font-family: Verdana, Arial, Helvetica, sans-serif;color: #333333;">
                          <asp:DataPager ID="DataPager1" runat="server">
                              <Fields>
                                  <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" />
                                  <asp:NumericPagerField />
                                  <asp:NextPreviousPagerField ButtonType="Button" ShowLastPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" />
                              </Fields>
                          </asp:DataPager>
                      </div>
                  </LayoutTemplate>
                  <SelectedItemTemplate>
                      <span style="background-color: #FFCC66;font-weight: bold;color: #000080;">Pais:
                      <asp:Label ID="PaisLabel" runat="server" Text='<%# Eval("Pais") %>' />
                      <br />
                      CodPais:
                      <asp:Label ID="CodPaisLabel" runat="server" Text='<%# Eval("CodPais") %>' />
                      <br />
                      <br />
                      </span>
                  </SelectedItemTemplate>
            </asp:ListView>
            <asp:SqlDataSource ID="SqlDataSourcePaises" runat="server" ConnectionString="<%$ ConnectionStrings:EmpresaConnectionString %>" SelectCommand="DamePaises" SelectCommandType="StoredProcedure"></asp:SqlDataSource>
        </div>
   
        <div>
       
        <asp:Chart ID="Chart1" runat="server" DataSourceID="SqlDataSourcePedidos" BackColor="White" CssClass="auto-style1" Palette="Chocolate">
            <Series>
                <asp:Series Name="Series1" XValueMember="Nombre" YValueMembers="FechaPedido">
                </asp:Series>
            </Series>
            <ChartAreas>
                <asp:ChartArea Name="ChartArea1">
                </asp:ChartArea>
            </ChartAreas>
        </asp:Chart>
            <asp:SqlDataSource ID="SqlDataSourcePedidos" runat="server" ConnectionString="<%$ ConnectionStrings:EmpresaConnectionString %>" SelectCommand="DamePedidos" SelectCommandType="StoredProcedure"></asp:SqlDataSource>
          
     </div>

          <uc1:ControlPruebas ID="ControlPruebas1" runat="server" />
    </form>

  
</body>
</html>








44.Aplicaciones web.Objeto Chart. Curso de C# con Visual Studio 2017.

44-.Aplicaciones web.Objeto Chart

   - En este capítulo del curso de programación en c# con visual studio 2017,vamos a ver un control de uso común en muchas de las páginas web que utilizamos habitualmente. Este control es el Chart, que es un componente que se utiliza para mostrar gráficos en pantalla de uan manera fácil.

 - El control de servidor Chart permite crear páginas ASP.NET que incluyan gráficos de análisis estadístico. Algunas de las  características  que admite el control Chart son las siguientes:
  • Series de datos, áreas de gráfico, ejes, leyendas, etiquetas y títulos.
  • Enlace de datos.
  • Manipulación de datos, como copiar, dividir, combinar, alinear, agrupar, ordenar, buscar y filtrar.
  • Fórmulas estadísticas y financieras.
  • Apariencia avanzada de los gráficos, como 3D, suavizado de contorno, iluminación y perspectiva.
- En el siguiente video os muestro como enlazar el control Chart  a un procedimiento almacenado de nuestra base de datos. Permite mostrar en pantalla gráficos enlazados a múltiples origenes de datos, en nuestra caso utilizamos nuestra base de datos de pruebas:


 - Os dejo un enlace a la página de Microsoft con más información este control:

- También os dejo el código de este ejemplo:

  • Procedimineto almacenado SQL con el que cargamos el control:
ALTER PROCEDURE [dbo].[DamePedidos]
   
AS
BEGIN

    SET NOCOUNT ON;
   
    SELECT Usuarios.Nombre, FechaPedido FROM Pedidos
    INNER JOIN Usuarios on Usuarios.IdUsuarios =Pedidos.IdUsuario

END

  •  Código de la página cliente aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EjemploControlesVarios.aspx.cs" Inherits="GestionVarios.EjemploControlesVarios" %>

<%@ Register Assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">


        <div>
       
        <asp:Chart ID="Chart1" runat="server" DataSourceID="SqlDataSourcePedidos" BackColor="White" CssClass="auto-style1" Palette="Chocolate">
            <Series>
                <asp:Series Name="Series1" XValueMember="Nombre" YValueMembers="FechaPedido">
                </asp:Series>
            </Series>
            <ChartAreas>
                <asp:ChartArea Name="ChartArea1">
                </asp:ChartArea>
            </ChartAreas>
        </asp:Chart>
            <asp:SqlDataSource ID="SqlDataSourcePedidos" runat="server" ConnectionString="<%$ ConnectionStrings:EmpresaConnectionString %>" SelectCommand="DamePedidos" SelectCommandType="StoredProcedure"></asp:SqlDataSource>
          
     </div>

    </form>
</body>
</html>

  •  Código de servidor de la página:
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace GestionVarios
{
    public partial class EjemploControlesVarios : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            int x = Chart1.ChartAreas.Count;
         }
    }
}

43.Aplicaciones web.Objeto Listview. Curso de C# con Visual Studio 2017.

43-.Aplicaciones web.Objeto Calendar

   - En este capítulo del curso de programación en c# con visual studio 2017,vamos a ver un control de uso común en muchas de las páginas web que utilizamos habitualmente. Este control es el ListView, que es un componente que muestra los valores de un origen de datos previamente seleccionado ,mediante plantillas definidas por el usuario.

- En esta ocasión vamos a cargar los datos del control utilizando el asistente que trae Visual Studio 2017. Este asistente nos permite seleccionar un origen de datos que puede ser un base de datos SQL o un fichero XML entre otros. En nuestro ejemplo vamos a enlazar el control a un procedimiento almacenado que nos devuelve el listado de paises y su código correspondiente.


- Una vez enlazado a un origen de datos como habéis visto en el video, es posible utilizar una de las plantillas predefinidas para visualizar los datos como más nos interesen.

- Como en el resto de controles de .NET también es posible editar las propiedades y eventos del control desde el fichero .cs en el que este alojado el control.

- Os dejo un enlace a la MSDN con más información y el código de la página aspx donde hemos alojado nuestro control de pruebas:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EjemploControlesVarios.aspx.cs" Inherits="GestionVarios.EjemploControlesVarios" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Calendar ID="Calendar1" runat="server" ></asp:Calendar>
            <asp:Label runat="server" ID="lblMostrar"></asp:Label>
            <asp:Button runat="server" ID="btnClic" Text="Dale" OnClick="btnClic_Click" />
            <br />
            <br />
            <asp:FileUpload ID="fileUpload" runat="server" />
            <asp:Button ID="btnFileUploada" runat="server" Text="Guardar" OnClick="btnFileUploada_Click" />
              <asp:Label runat="server" ID="lblFileupload"></asp:Label>
            <asp:HiddenField ID="HiddenField1" runat="server" />
            <br />
            <br />
              <asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSourcePaises" OnSelectedIndexChanging="ListView1_SelectedIndexChanging" >
                  <AlternatingItemTemplate>
                      <span style="background-color: #FAFAD2;color: #284775;">Pais:
                      <asp:Label ID="PaisLabel" runat="server" Text='<%# Eval("Pais") %>' />
                      <br />
                      CodPais:
                      <asp:Label ID="CodPaisLabel" runat="server" Text='<%# Eval("CodPais") %>' />
                      <br />
                      <br />
                      </span>
                  </AlternatingItemTemplate>
                  <EditItemTemplate>
                      <span style="background-color: #FFCC66;color: #000080;">Pais:
                      <asp:TextBox ID="PaisTextBox" runat="server" Text='<%# Bind("Pais") %>' />
                      <br />
                      CodPais:
                      <asp:TextBox ID="CodPaisTextBox" runat="server" Text='<%# Bind("CodPais") %>' />
                      <br />
                      <asp:Button ID="UpdateButton" runat="server" CommandName="Update" Text="Actualizar" />
                      <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="Cancelar" />
                      <br />
                      <br />
                      </span>
                  </EditItemTemplate>
                  <EmptyDataTemplate>
                      <span>No se han devuelto datos.</span>
                  </EmptyDataTemplate>
                  <InsertItemTemplate>
                      <span style="">Pais:
                      <asp:TextBox ID="PaisTextBox" runat="server" Text='<%# Bind("Pais") %>' />
                      <br />
                      CodPais:
                      <asp:TextBox ID="CodPaisTextBox" runat="server" Text='<%# Bind("CodPais") %>' />
                      <br />
                      <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="Insertar" />
                      <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="Borrar" />
                      <br />
                      <br />
                      </span>
                  </InsertItemTemplate>
                  <ItemTemplate>
                      <span style="background-color: #FFFBD6;color: #333333;">Pais:
                      <asp:Label ID="PaisLabel" runat="server" Text='<%# Eval("Pais") %>' />
                      <br />
                      CodPais:
                      <asp:Label ID="CodPaisLabel" runat="server" Text='<%# Eval("CodPais") %>' />
                      <br />
                      <br />
                      </span>
                  </ItemTemplate>
                  <LayoutTemplate>
                      <div id="itemPlaceholderContainer" runat="server" style="font-family: Verdana, Arial, Helvetica, sans-serif;">
                          <span runat="server" id="itemPlaceholder" />
                      </div>
                      <div style="text-align: center;background-color: #FFCC66;font-family: Verdana, Arial, Helvetica, sans-serif;color: #333333;">
                          <asp:DataPager ID="DataPager1" runat="server">
                              <Fields>
                                  <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" />
                                  <asp:NumericPagerField />
                                  <asp:NextPreviousPagerField ButtonType="Button" ShowLastPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" />
                              </Fields>
                          </asp:DataPager>
                      </div>
                  </LayoutTemplate>
                  <SelectedItemTemplate>
                      <span style="background-color: #FFCC66;font-weight: bold;color: #000080;">Pais:
                      <asp:Label ID="PaisLabel" runat="server" Text='<%# Eval("Pais") %>' />
                      <br />
                      CodPais:
                      <asp:Label ID="CodPaisLabel" runat="server" Text='<%# Eval("CodPais") %>' />
                      <br />
                      <br />
                      </span>
                  </SelectedItemTemplate>
            </asp:ListView>
            <asp:SqlDataSource ID="SqlDataSourcePaises" runat="server" ConnectionString="<%$ ConnectionStrings:EmpresaConnectionString %>" SelectCommand="DamePaises" SelectCommandType="StoredProcedure"></asp:SqlDataSource>
        </div>
   
       
      
    </form>
</body>
</html>






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;
        }
    }
}

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