Mostrando las entradas con la etiqueta Session. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Session. Mostrar todas las entradas

miércoles, 3 de junio de 2015

Videos - Tercer Taller .NET Domingos (Parte 1)

Videos del Tercer Taller .NET Domingos (Parte 1)

Comparto con los visitantes del Blog los Videos (sin audio) del Tercer Taller de los Domingos, con temas variados como .NET Remoting, Programación de Tareas, etc.

Nota: El Demo 01 es un Chat en .NET Remoting pero no fue grabado.

Demo 02 - Aplicación con NET Remoting de Login con Captcha

En este video se muestra como crear una aplicación distribuida con .NET Remoting para el CAPTCHA.

Primero se crea la librería remota, luego el servidor remoto que es una aplicación de consola y finalmente una aplicación cliente en Windows Forms.

En la aplicación cliente se llama en forma asíncrona 1000 veces el método remoto que crea el Captcha.


Demo 03 - Aplicación con NET Remoting de Actualización de Archivos

En este video se enseña como crear una aplicación remota con .NET Remoting que permita descargar y actualizar una aplicación desde un servidor a los clientes.

Para esto se crea una aplicación Windows Forms Editor que es la que se va a descargar y actualizar sus versiones. Luego creamos una Librería Remota que devuelva los bytes de la aplicación actualizada.

También creamos una aplicación de Consola que sirve de Servidor Remoto (aloja a la Librería de Actualización) y finalmente la Aplicación Cliente Windows (oculta en el Systray) que permite invocar a la librería remota y actualizar la aplicación.

Finalmente, un problema que se tuvo fue el bloqueo del archivo al usar Reflection para averiguar el Nombre y la Versión del Ensamblado para hacer la actualización, pero este se resolvió no usando la Url sino los bytes del archivo.


Demo 04 - Generador de Código .NET y Performance con Session

En este video muestro un poco sobre mi Generador de Código .NET que crea Procedimientos Almacenados, Entidades de Negocio, Capa de Acceso a Datos, Capa de Reglas del Negocio y Formularios Web Forms de forma eficiente.

También se muestra un proyecto Web de Prueba y se analiza un formulario con una grilla paginada con una tabla de mas de 250,000 registros y como al usar Session el procesador se eleva al 100%.

Se hace un análisis de la performance reduciendo los datos del Procedimiento Almacenado a 100,000 luego a 50000, después a 20,000 y 10,000 observándose que el procesador ya no se eleva.

La conclusión es que cualquier operación de lectura o escritura de un objeto Session con una Lista de Objetos que tiene mas de 20,000 registros ocasiona que el procesador se eleve demasiado, es decir, usar como límite de registros 20,000 para el Session sería lo mas adecuado.


Demo 05 - Copiador de Archivos incluyendo Subdirectorios

En este video enseño como crear una aplicación de consola que permita copiar todos los archivos junto con todos los directorios de una ruta a otra.

Luego se crea una Tarea Programada en Windows usando el Task Scheduler que permita ejecutar dicha aplicación a diario.


Demo 06 - Automatizar Programación de Tareas en .NET (Parte 1)

En este video se muestra la primera parte de una aplicación de Windows Forms que permite Automatizar la Programación de Tareas, es decir, lo que hace el Task Scheduler.

La primera parte consiste en listar todas las tareas programadas en un ListView mostrando el nombre de la tarea, su folder y su estado: en ejecución, detenido, deshabilitado, etc.

Las Tareas que pertenecen al folder DSOFT y las que están en ejecución se muestran con un color de fondo y texto diferente.


Demo 06 - Automatizar Programación de Tareas en .NET (Parte 2)

En este video se muestra la segunda parte de una aplicación de Windows Forms que permite Automatizar la Programación de Tareas, es decir, lo que hace el Task Scheduler.

En esta segunda parte se enseña como crear una nueva tarea, la cual se muestra en la lista de tareas.


Demo 07 - Optimizar Web API con Serializacion de String

Este video sin duda es uno de los mejores, ya que enseño como Optimizar un Servicio Web API usando mi propio Serializador que convierte una Lista de Objetos en cadenas separadas por un caracter los campos y otro los registros.

La técnica tradicional es usar JSON, pero en este video se observa como se reduce a mas de la mitad el tamaño de los bytes enviados desde el servidor web al cliente usando Strings.

En el cliente usamos una función de JavaScript que realiza la presentación de los datos en una tabla.

Además se muestra como hacer para devolver solo las columnas que se desean pintar es decir, sin necesidad de estar creando varias entidades una para cada vista, al serializar indicamos que columnas deseamos enviar, reduciendo mas aún el tamaño del mensaje.

Sin dudas,  un video muy interesante para cualquier desarrollador que quiere optimizar el envío de datos del servidor al cliente, ya que no solo sirve para Web API, sino para cualquier método en MVC o WebForms.


Nota: A partir de mañana voy a publicar varios Demos relacionados a Performance, incluyendo el código de este último Demo de Web API con Serialización Personalizada (mejor que JSON).

jueves, 19 de marzo de 2015

Videos - Curso de ASP.NET MVC CIPSA (Parte 4)

Videos del Curso de ASP.NET MVC CIPSA (Parte 4)

Cuarta parte del curso dictado en CIPSA de Desarrollo de Aplicaciones Web con ASP.NET MVC. Esta vez los demos son sobre Gráficos Asíncronos en el Servidor con Vista Parcial y el Carrito de Compras en MVC.

Curso de MVC CIPSA - Demo 16 (Parte 1) - Gráfico Asíncrono en el Servidor con Vista Parcial

Este video es la primera parte de una aplicación que permite consultar los productos por categorías y mostrar gráficos de datos de diferentes tipos: Barras, Columnas, Lineas y Pie.
La consulta se realiza en forma asíncrona usando un Formulario Ajax y una vista parcial para mostrar solo la tabla y el gráfico sin actualizar toda la pantalla.


Curso de MVC CIPSA - Demo 16 (Parte 2) - Gráfico Asíncrono en el Servidor con Vista Parcial

Este video es la segunda parte de una aplicación que permite consultar los productos por categorías y mostrar gráficos de datos de diferentes tipos: Barras, Columnas, Lineas y Pie.
La consulta se realiza en forma asíncrona usando un Formulario Ajax y una vista parcial para mostrar solo la tabla y el gráfico sin actualizar toda la pantalla.


Curso de MVC CIPSA - Demo 17 (Parte 1) - Carrito de Compras

Este video es la primera parte de una aplicación que permite crear una orden o pedido de un conjunto de productos por Internet.
Incluye una pagina de login con Captcha y cifrado de clave mediante MD5 usando CrytpoJS, una pagina de selección de Categorías, una pagina de Productos por Categoría y finalmente la pagina del Pedido del Cliente.


Curso de MVC CIPSA - Demo 17 (Parte 2) - Carrito de Compras

Este video es la segunda parte de una aplicación que permite crear una orden o pedido de un conjunto de productos por Internet.
Incluye una pagina de login con Captcha y cifrado de clave mediante MD5 usando CrytpoJS, una pagina de selección de Categorías, una pagina de Productos por Categoría y finalmente la pagina del Pedido del Cliente.


Curso de MVC CIPSA - Demo 17 (Parte 3) - Carrito de Compras

Este video es la tercera parte de una aplicación que permite crear una orden o pedido de un conjunto de productos por Internet.
Incluye una pagina de login con Captcha y cifrado de clave mediante MD5 usando CrytpoJS, una pagina de selección de Categorías, una pagina de Productos por Categoría y finalmente la pagina del Pedido del Cliente.


Curso de MVC CIPSA - Demo 17 (Parte 4) - Carrito de Compras

Este video es la cuarta parte de una aplicación que permite crear una orden o pedido de un conjunto de productos por Internet.
Incluye una pagina de login con Captcha y cifrado de clave mediante MD5 usando CrytpoJS, una pagina de selección de Categorías, una pagina de Productos por Categoría y finalmente la pagina del Pedido del Cliente.


Curso de MVC CIPSA - Demo 17 (Parte 5) - Carrito de Compras

Este video es la quinta parte de una aplicación que permite crear una orden o pedido de un conjunto de productos por Internet.
Incluye una pagina de login con Captcha y cifrado de clave mediante MD5 usando CrytpoJS, una pagina de selección de Categorías, una pagina de Productos por Categoría y finalmente la pagina del Pedido del Cliente.


Curso de MVC CIPSA - Demo 17 (Parte 6) - Carrito de Compras

Este video es la sexta y última parte de una aplicación que permite crear una orden o pedido de un conjunto de productos por Internet.
Incluye una pagina de login con Captcha y cifrado de clave mediante MD5 usando CrytpoJS, una pagina de selección de Categorías, una pagina de Productos por Categoría y finalmente la pagina del Pedido del Cliente.


jueves, 12 de marzo de 2015

Videos - Curso de ASP.NET MVC Domingos (Parte 1)

Videos del Curso de ASP.NET MVC Domingos (Parte 1)

Comparto la primera parte del Curso de ASP.NET MVC realizado los Domingos.

Curso de MVC Domingos - Demo 01 - Acciones en un Controlador

Este video enseña como crear una simple aplicación web en ASP.NET MVC que tenga solo un controlador con varias acciones que devuelvan directamente datos de tipo cadena y fecha hora.
También se ve como configurar la acción y el controlador que inicia.


Curso de MVC Domingos - Demo 02 - Vistas y Navegación entre Acciones

En este video se muestra como crear vistas a partir de acciones y también como se navega entre vistas usando los Html Helpers ActionLinks.


Curso de MVC Domingos - Demo 03 - Formulario MVC y Controles Html Helpers

Este video muestra como enviar datos al servidor usando un formulario MVC y controles HTML Helpers para registrar los datos de un empleado.
Además muestra como cargar combos desde un archivo XML usando XmlTextReader y desde un archivo de Texto usando File.ReadAllLines.


Curso de MVC Domingos - Demo 04 (Parte 1) - Ordenar, Filtrar, Exportar a Texto y Excel

Este video muestra la primera parte de una aplicación web en ASP.NET MVC que lista los productos y permite ordenarlos por cualquier columna en forma ascendente y descendente.
Además permite filtrar los productos usando controles en las cabeceras, tanto textos como combos y muestra los datos encontrados de color rojo y en negrita usando un estilo.
Por último también permite exportar los datos buscados a un archivo de Texto y a Excel usando OLEDB y un archivo schema.ini para resolver los problemas de formato de columnas.


Curso de MVC Domingos - Demo 04 (Parte 2) - Ordenar, Filtrar, Exportar a Texto y Excel

Este video muestra la segunda parte de una aplicación web en ASP.NET MVC que lista los productos y permite ordenarlos por cualquier columna en forma ascendente y descendente.
Además permite filtrar los productos usando controles en las cabeceras, tanto textos como combos y muestra los datos encontrados de color rojo y en negrita usando un estilo.
Por último también permite exportar los datos buscados a un archivo de Texto y a Excel usando OLEDB y un archivo schema.ini para resolver los problemas de formato de columnas.


Curso de MVC Domingos - Demo 04 (Parte 3) - Ordenar, Filtrar, Exportar a Texto y Excel

Este video muestra la tercera parte de una aplicación web en ASP.NET MVC que lista los productos y permite ordenarlos por cualquier columna en forma ascendente y descendente.
Además permite filtrar los productos usando controles en las cabeceras, tanto textos como combos y muestra los datos encontrados de color rojo y en negrita usando un estilo.
Por último también permite exportar los datos buscados a un archivo de Texto y a Excel usando OLEDB y un archivo schema.ini para resolver los problemas de formato de columnas.


viernes, 6 de marzo de 2015

Videos - Curso de ASP.NET MVC CIPSA (Parte 3)

Videos del Curso de ASP.NET MVC CIPSA (Parte 3)

Tercera parte del curso dictado en CIPSA de Desarrollo de Aplicaciones Web con ASP.NET MVC. Esta vez los demos son sobre Programación Asíncrona con Ajax y jQuery.

Curso de MVC CIPSA - Demo 11 - Consulta Síncrona Con Vista Parcial

Este video muestra como filtrar desconectado en forma síncrona los productos por categoría, usando una Vista Parcial para reusar el HTML.
Las categorías se listan en un Combo y los productos en una tabla. Al hacer el filtro se pinta todo el HTML.


Curso de MVC CIPSA - Demo 12 - Consulta Asíncrona Con Formulario Ajax y Vista Parcial

Este video muestra como filtrar desconectado en forma asíncrona los productos por categoría, usando una Vista Parcial para reusar el HTML.
Las categorías se listan en un Combo y los productos en una tabla. Al hacer el filtro se hace una llamada asíncrona Ajax y se pinta solo el HTML de la vista parcial.


Curso de MVC CIPSA - Demo 13 - Consulta Asíncrona Con Formulario Ajax y JSON

Este video muestra como filtrar desconectado en forma asíncrona los productos por categoría, usando JSON y pintando en el cliente por JavaScript.
Las categorías se listan en un Combo y los productos en una tabla. Al hacer el filtro se hace una llamada asíncrona Ajax y se devuelve un arreglo de objetos en JavaScript (JSON), el cual se recibe y se pintan las filas dentro de la tabla en el cliente web.


Curso de MVC CIPSA - Demo 14 - Consulta Asíncrona con jQuery Ajax Form y JSON

Este video muestra como filtrar desconectado en forma asíncrona los productos por categoría, usando JSON y pintando en el cliente por JavaScript.
Las categorías se listan en un Combo y los productos en una tabla. Al hacer el filtro se hace una llamada asíncrona con jQuery Ajax y se devuelve un arreglo de objetos en JavaScript (JSON), el cual se recibe y se pintan las filas dentro de la tabla en el cliente web.


Curso de MVC CIPSA - Demo 15 - Consulta Asíncrona con Ajax ActionLink y Vista Parcial

Este video muestra como filtrar desconectado en forma asíncrona los productos por categoría, usando una Vista Parcial para reusar el HTML.
Las categorías se ven como links y al seleccionar una se muestra una vista parcial con los productos de esa categoría.


jueves, 5 de marzo de 2015

Videos - Curso de ASP.NET MVC CIPSA (Parte 2)

Videos del Curso de ASP.NET MVC CIPSA (Parte 2)

Segunda parte del curso dictado en CIPSA de Desarrollo de Aplicaciones Web con ASP.NET MVC.

Curso de MVC CIPSA - Demo 07 - Consulta Conectada de Empleado con Foto

En este video se aprenderá como hacer una consulta conectada o en línea para mostrar los datos del empleado incluyendo su foto desde base de datos.



Curso de MVC CIPSA - Demo 08 - Consulta Desconectada de Empleado con Foto

En este video se aprenderá como hacer una consulta desconectada almacenando en sesión los empleados y mostrando los datos de cada uno cuando se solicite.


Curso de MVC CIPSA - Demo 09 (Parte 1) - Grilla de Empleados con Filtros en la Cabecera

Este video es la primera parte de como crear una tabla con filtros en la cabecera que permita consultar los empleados en forma desconectada y mostrar los resultados con colores para las coincidencias de los datos buscados.


Curso de MVC CIPSA - Demo 09 (Parte 2) - Grilla de Empleados con Filtros en la Cabecera

Este video es la segunda parte de como crear una tabla con filtros en la cabecera que permita consultar los empleados en forma desconectada y mostrar los resultados con colores para las coincidencias de los datos buscados.


Curso de MVC CIPSA - Demo 10 (Parte 1) - Grilla de Productos con Combos en la Cabecera

Este video es la primera parte de como crear una tabla con filtros en la cabecera que contenga textos y combos para filtrar los productos y mostrar los resultados de color.


Curso de MVC CIPSA - Demo 10 (Parte 2) - Grilla de Productos con Combos en la Cabecera

Este video es la segunda parte de como crear una tabla con filtros en la cabecera que contenga textos y combos para filtrar los productos y mostrar los resultados de color.


No se olviden darle like y repostear.

Saludos.

miércoles, 4 de marzo de 2015

Videos - Curso de ASP.NET MVC CIPSA (Parte 1)

Videos del Curso de ASP.NET MVC CIPSA (Parte 1)

Esta semana he inaugurado mi canal de YouTube, donde encontrarán videos de desarrollo en .NET, HTML5, Móviles, etc.

Están invitados a suscribirse y darle Like a los que les guste, les dejo los enlaces de los videos que ya subí sobre un curso de capacitación en ASP.NET MVC a la Empresa CIPSA.

Nota: Por ahora, los videos No tienen audio ya que no uso micrófono y están grabados con Cantasia.

Curso de MVC CIPSA - Demo 01 - Controlador y Acciones

Este video muestra como crear una simple aplicación ASP.NET MVC usando Razor y C# que contenga solo un controlador y métodos de acción que devuelvan simples valores.


Curso de MVC CIPSA - Demo 02 (Parte 1) - Formulario MVC y Controles HTML Helpers

Este video muestra la primera parte de como crear un Formulario MVC usando los Controles HTML Helpers para registrar los datos de un empleado. También se muestra como cargar un archivo de texto y un archivo XML en un par de Combos.


Curso de MVC CIPSA - Demo 02 (Parte 2) - Formulario MVC y Controles HTML Helpers

Este video muestra la segunda parte de como crear un Formulario MVC usando los Controles HTML Helpers para registrar los datos de un empleado. También se muestra como cargar un archivo de texto y un archivo XML en un par de Combos.


Curso de MVC CIPSA - Demo 03 - Aplicación en Capas con Vista Con Tipo

Este video muestra como distribuir la lógica de la aplicación en varias capas, creando librerías de entidades del negocio, acceso a datos y reglas del negocio. Además se crea una vista con tipo (Modelo) para listar los empleados usando el control WebGrid.


Curso de MVC CIPSA - Demo 04 - Grilla de Empleados Paginada

Este video enseña como realizar paginación en una tabla de empleados (grilla) trabajando en forma desconectada. También se muestra como se guarda un valor entre request usando el TempData.


Curso de MVC CIPSA - Demo 05 - Grilla de Empleados Ordenada

Este video enseña como realizar ordenación en una tabla de empleados (grilla) trabajando en forma desconectada. También se muestra como se guarda un valor entre request usando el TempData.


Curso de MVC CIPSA - Demo 06 - Grilla de Empleados Paginada y Ordenada

Este video enseña como realizar paginación y ordenación a la vez, en una tabla de empleados (grilla) trabajando en forma desconectada. También se muestra como se guarda un valor entre request usando el TempData.


No se olviden de suscribirse y darle Like, para seguir subiendo diariamente mas videos.

PD: Los que desean pueden repostear los videos en sus blogs o en YouTube.

martes, 4 de noviembre de 2014

El Demo del Día: Paginación en un GridView con Columna de CheckBoxs

Paginación en un GridView con Columna de CheckBoxs

Después de mas de 2 meses retomamos los posts de ASP .NET WebForms, en esta ocasión publicaré un caso práctico muy útil.

Requerimiento

Se desea listar registros en forma paginada usando el GridView pero mostrando una columna con Checks que permita seleccionar los registros para un uso posterior como grabar datos en el servidor.

Problema

Si creamos una grilla sin paginar con una columna de tipo CheckBox no hay problemas, pero si paginamos, al seleccionar los checks de una pagina y cambiar de pagina se perderán debido a que la grilla siempre se tiene que enlazar nuevamente para mostrar la pagina seleccionada.

Solución

Para solucionar el problema debemos enlazar la columna checkbox a una propiedad de la entidad del negocio de tipo boolean, luego debemos almacenar el valor seleccionado, lo cual se puede hacer de 2 formas:
1. Guardar el valor cada vez que se selecciona el check, ya sea para marcar o desmarcar.
2. Guardar los valores seleccionados al regresar al servidor ya sea al cambiar de página o al hacer PostBack mediante algún botón.

Definitivamente, la mejor opción es la segunda, es decir, cada vez que ocurra un Postback guardaremos los checks seleccionados de la pagina actual.

Crear el Procedimiento Almacenado en la Base de Datos de SQL Server

Create Procedure uspProductsListar
As
Select ProductID,ProductName,SupplierID,CategoryID,UnitPrice,UnitsInStock
From Products

Crear la Aplicación Web en ASP .NET Web Form

Crear un "Nuevo Sitio web vacío de ASP .NET" en C# llamado "GridView_Paginado_Checks".
Para simplificar el Demo no he creado librerías de clases y las clases las he incluido dentro de la aplicación Web.

Crear la Clase Entidad del Negocio

Crear la clase beProducto escribiendo el siguiente código:

using System;
namespace GridView_Paginado_Checks
{
    public class beProducto
    {
        public bool Seleccion { get; set; }
        public int IdProducto { get; set; }
        public string Nombre { get; set; }
        public int IdProveedor { get; set; }
        public int IdCategoria { get; set; }
        public decimal PrecioUnitario { get; set; }
        public short Stock { get; set; }
    }
}

Nota: La propiedad Seleccion es la que se va a enlazar al check para guardar el valor seleccionado.

Crear la Clase de Acceso a Datos

Crear la clase daProducto escribiendo el siguiente código:

using System;
using System.Data; //CommadType
using System.Data.SqlClient; //SqlConnection, SqlCommand, SqlDataReader
using System.Collections.Generic; //List
namespace GridView_Paginado_Checks
{
    public class daProducto
    {
        public List<beProducto> listar(SqlConnection con)
        {
            List<beProducto> lbeProducto = null;
            SqlCommand cmd = new SqlCommand("uspProductsListar", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlDataReader drd = cmd.ExecuteReader(CommandBehavior.SingleResult);
            if (drd != null)
            {
                lbeProducto = new List<beProducto>();
                int posIdProducto = drd.GetOrdinal("ProductID");
                int posNombre = drd.GetOrdinal("ProductName");
                int posIdProveedor = drd.GetOrdinal("SupplierID");
                int posIdCategoria = drd.GetOrdinal("CategoryID");
                int posPrecioUnitario = drd.GetOrdinal("UnitPrice");
                int posStock = drd.GetOrdinal("UnitsInStock");
                beProducto obeProducto;
                while (drd.Read())
                {
                    obeProducto = new beProducto();
                    obeProducto.IdProducto = drd.GetInt32(posIdProducto);
                    obeProducto.Nombre = drd.GetString(posNombre);
                    obeProducto.IdProveedor = drd.GetInt32(posIdProveedor);
                    obeProducto.IdCategoria = drd.GetInt32(posIdCategoria);
                    obeProducto.PrecioUnitario = drd.GetDecimal(posPrecioUnitario);
                    obeProducto.Stock = drd.GetInt16(posStock);
                    lbeProducto.Add(obeProducto);
                }
                drd.Close();
            }
            return (lbeProducto);
        }
    }
}

Nota: Tiene que haberse creado el Procedimiento Almacenado "uspProductsListar" en la BD Northwind.

Crear la Clase de Reglas del Negocio

Crear la clase brProducto escribiendo el siguiente código:

using System;
using System.Collections.Generic; //List
using System.Data.SqlClient; //SqlConnection
using System.Configuration; //ConfigurationManager
namespace GridView_Paginado_Checks
{
    public class brProducto
    {
        public List<beProducto> listar()
        {
            List<beProducto> lbeProducto = null;
            string conexion = ConfigurationManager.ConnectionStrings["conNW"].ConnectionString;
            using (SqlConnection con = new SqlConnection(conexion))
            {
                try
                {
                    con.Open();
                    daProducto odaProducto = new daProducto();
                    lbeProducto = odaProducto.listar(con);
                }
                catch (SqlException ex)
                {                  
                    foreach (SqlError err in ex.Errors)
                    {
                        //Capturar cada error y grabar un Log
                    }
                }
            } //con.Close(); con.Dispose(); con = null;
            return (lbeProducto);
        }
    }
}

Nota: Hay que hacer referencia a la librería "System.Configuration.dll" para usar la clase ConfigurationManager para leer el archivo de configuración.

Crear el Archivo de Hoja de Estilo

Agregar un archivo de hoja de estilo llamado ACME.css y escribir lo siguiente:

body {
    background-color:aqua;
}
.Titulo {
    background-color:black;
    color:white;
    text-transform:uppercase;
    font-size:xx-large;
    font-weight:bold;
}
.AnchoTotal {
    width:100%;
}
.Centrado {
    text-align:center;
}
.Subtitulo {
    background-color:white;
    color:blue;
    text-transform:capitalize;
    font-size:x-large;
    font-weight:bold;
}
.FilaCabecera {
    background-color: lightgray;
    color:black;
}
.FilaDatos {
    background-color: white;
    color:blue;
}

Crear la Pagina ASP .NET como un Formulario Web Form

Agregar un Formulario Web Form al proyecto llamado: "ListaProductos.aspx" y escribir lo siguiente:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ListaProductos.aspx.cs" Inherits="GridView_Paginado_Checks.ListaProductos" %>
<%@ Import Namespace="GridView_Paginado_Checks" %>
<!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>
    <link href="ACME.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <table class="AnchoTotal">
            <tr class="Titulo">
                <td>Paginacion en un GridView con Columna de Checks</td>
            </tr>
            <tr class="Subtitulo">
                <td>Selecciona de la Lista de Productos</td>
            </tr>
            <tr>
                <td>
                    <asp:GridView ID="gvProducto" AllowPaging="true" AutoGenerateColumns="false"
                        Width="800px" runat="server" OnPageIndexChanging="paginarProductos">
                        <HeaderStyle CssClass="FilaCabecera" />
                        <RowStyle CssClass="FilaDatos" />
                        <PagerStyle CssClass="FilaCabecera" />
                        <Columns>
                            <asp:TemplateField ItemStyle-Width="20px">
                                <ItemTemplate>
                                    <asp:CheckBox ID="chkSeleccion" runat="server"
                                      Checked="<%#((beProducto)Container.DataItem).Seleccion%>"  />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Código" ItemStyle-Width="80px">
                                <ItemTemplate>
                                    <%#((beProducto)Container.DataItem).IdProducto%>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Descripción del Producto"
                              ItemStyle-Width="200px">
                                <ItemTemplate>
                                    <%#((beProducto)Container.DataItem).Nombre%>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Id Prov" ItemStyle-Width="80px">
                                <ItemTemplate>
                                    <%#((beProducto)Container.DataItem).IdProveedor%>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Id Cat" ItemStyle-Width="80px">
                                <ItemTemplate>
                                    <%#((beProducto)Container.DataItem).IdCategoria%>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Pre Unit" ItemStyle-Width="80px">
                                <ItemTemplate>
                                    <%#((beProducto)Container.DataItem).PrecioUnitario.ToString("n2")%>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Stock" ItemStyle-Width="80px">
                                <ItemTemplate>
                                    <%#((beProducto)Container.DataItem).Stock%>
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>
                </td>
            </tr>
            <tr>
                <td class="Centrado">
                    <asp:Button ID="btnGrabar" Text="Grabar" runat="server"
                      OnClick="grabarProductosSeleccionados" />
                </td>
            </tr>
            <tr>
                <td><asp:Label ID="lblMensaje" Font-Bold="true" runat="server"/></td>
            </tr>
        </table>
    </div>
    </form>
</body>
</html>

El preview del diseño se mostrará similar a la siguiente figura:


Escribir el siguiente código C# en la página:

using System;
using System.Text; //StringBuilder
using System.Collections.Generic; //List
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace GridView_Paginado_Checks
{
    public partial class ListaProductos : System.Web.UI.Page
    {
        List<beProducto> lbeProducto;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                brProducto obrProducto = new brProducto();
                lbeProducto = obrProducto.listar();
                Session["Productos"] = lbeProducto;
                gvProducto.DataSource = lbeProducto;
                gvProducto.DataBind();
            }
            else
            {
                guardarChecksPagina();
            }
        }

        protected void paginarProductos(object sender, GridViewPageEventArgs e)
        {
            lbeProducto = (List<beProducto>)Session["Productos"];
            gvProducto.PageIndex = e.NewPageIndex;
            gvProducto.DataSource = lbeProducto;
            gvProducto.DataBind();
        }

        private void guardarChecksPagina()
        {
            lbeProducto = (List<beProducto>)Session["Productos"];
            int indice;
            for (int i = 0; i < gvProducto.Rows.Count; i++)
            {
                indice = (gvProducto.PageIndex * gvProducto.PageSize) + i;
                lbeProducto[indice].Seleccion =
                ((CheckBox)gvProducto.Rows[i].Cells[0].Controls[1]).Checked;
            }
            Session["Productos"] = lbeProducto;
        }

        protected void grabarProductosSeleccionados(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder("Ids Seleccionados: ");
            lbeProducto = (List<beProducto>)Session["Productos"];
            //List<beProducto> lbeSeleccion = lbeProducto.FindAll(x => x.Seleccion.Equals(true));
            for (int i = 0; i < lbeProducto.Count; i++)
            {
                if (lbeProducto[i].Seleccion)
                {
                    sb.Append(lbeProducto[i].IdProducto);
                    sb.Append(", ");
                }
            }
            sb = sb.Remove(sb.Length - 2, 2);
            lblMensaje.Text = sb.ToString();
        }
    }
}

Nota: La principal función es "guardarChecksPagina" que se llama en los PostBacks y permite guardar todos los checks de la pagina actual en la lista de objetos.
Además en la función controladora "grabarProductosSeleccionados" asociada al click del botón "btnGuardar" se usa un StringBuilder para concatenar los códigos de todos los checks seleccionados y mostrarlos en el Label "lblMensaje".
En esta función hay una linea comentada que permite crear una lista solo con los productos seleccionados, para nuestro caso solo se mostrará en pantalla, pero si se debe enviar al servidor solo los productos seleccionados usar esta linea y comentar el resto.

Modificar el Archivo Web.Config para especificar la cadena de conexión a Northwind

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <connectionStrings>
    <add name="conNW" providerName="System.Data.SqlClient"
      connectionString="uid=UsuarioNW;pwd=123456;data source=DSOFT\Sqlexpress;
      initial catalog=Northwind"/>
  </connectionStrings>
    <system.web>
      <compilation debug="true" targetFramework="4.5" />
      <httpRuntime targetFramework="4.5" />
    </system.web>
</configuration>

Probar la Pagina Web

Guardar el Sitio Web, clic derecho a la Pagina "ListaProductos.aspx" y seleccionar "Ver en el explorador". Se mostrará una ventana similar a la siguiente figura:


Seleccionar checks de diferentes paginas y verificar que se han quedado seleccionados al cambiar de pagina, luego click al botón "Guardar" para confirmar los códigos solo de los productos seleccionados, tal como se muestra en la siguiente figura:


Comentario Final

En este post hemos visto como mantener los registros seleccionados usando una columna tipo check en una grilla paginada, la cual usa plantillas de datos para las columnas y asocia la propiedad checked del checkbox a una propiedad Seleccion del modelo o entidad del negocio.

Descarga:
GridView_Paginado_Checks

miércoles, 3 de septiembre de 2014

El Libro del Día: Beginning Windows Store Application Development

El Libro del Día: 2014-09-03

Titulo: Beginning Windows Store Application Development
Autor: Scott Isaacs, Kyle Burns
Editorial: Apress
Nro Paginas: 520

Capítulos:
Chapter 1: Welcome to a Touch-First World
Chapter 2: The Microsoft Design Language
Chapter 3: Designing Windows Store Applications
Chapter 4: Visual Studio 2012 and Windows Store Application Types
Chapter 5: HTML Controls
Chapter 6: WinJS Controls
Chapter 7: WinJS Collection Controls
Chapter 8: WinJS Custom Controls
Chapter 9: Building the User Interface
Chapter 10: Transitions and Animations
Chapter 11: Data-Binding Concepts
Chapter 12: Promises
Chapter 13: Web Workers
Chapter 14: Data Source Options
Chapter 15: Session State and Settings
Chapter 16: Files
Chapter 17: Handling State Changes
Chapter 18: External Libraries
Chapter 19: Search and Share Contracts
Chapter 20: Printing
Chapter 21: Notifications and Tiles
Chapter 22: Camera and Location
Chapter 23: Sharing Apps in the Windows Store

Descarga:
Beginning_WindowsStore_Application_Development