2do Curso de Desarrollo de Aplicaciones Móviles Bajo Android
Comparto con ustedes el contenido del nuevo programa de capacitación que se estará brindando para todos los interesados en el desarrollo de aplicaciones nativas en Android.
Este curso será presencial en la ciudad de Lima, Perú y será impartido por el consultor Eduardo Monroy Husillos de nacionalidad española, quien cuenta con amplia experiencia en desarrollo bajo esta plataforma y con especialidad en Internet de las Cosas IoT.
Formación académica del expositor:
Maestría especialidad de electrónica industrial (Escuela de Ingenieros de Bilbao).
Postgrado en sistema de transmisión de datos, telecomunicaciones analógicas y digitales. (Escuela de Ingenieros de Bilbao)
Máster en programación en dispositivos móviles iOS. (Standford University)
Capacitación en programación en Android (Aula Mentor – Ministerio de Educación)
Sistemas de localización RFID Activa IP (Dusseldorf – Alemania)
Técnicas de localización mediante sensores Smartphone (Heathrow – Inglaterra)
Contenido del curso:
Marco Teórico:
Conceptos Generales:
Entorno de desarrollo Android (Android Studio).
Estructura de un proyecto Android
Componentes de una aplicación Android
Desarrollo de una aplicación sencilla
Interfaz de Usuario:
Interfaz de usuario (Layouts)
Interfaz de usuario (CardView)
Interfaz de usuario (Tabs)
Interfaz de usuario (Fragments)
Interfaz de usuario (controles personalizados)
Controles básicos (botones)
Controles básicos (texto e imágenes)
Controles básicos (Checkbox y RadioButton)
Controles de selección (Spinner)
Controles de selección (ListView)
Controles de selección (ViewHolder)
Controles de selección (GridView)
Controles de selección (RecyclerView)
ActionBar / AppBar / ToolBar + Navegacion (filter / Tabs)
Animaciones básicas (CoordinatorLayout)
Colores (Librería Palette)
Menús:
Menús y submenús básicos
Menús contextuales
Opciones avanzadas
Widgets:
Interfaz de usuario en Android (uso de Widgets)
Gestión de Preferencias:
SharedPreferences
PreferenceActivity
Base de Datos:
Primeros pasos con SqLite
Inserción, actualización y eliminación de registros
Consulta y recuperación de registros.
Programación Android Wear
Desarrollo de apps para weareables
Uso de activities
Uso de sensores
Reconocimiento de Voz
Ficheros (FileManager):
Lectura
Escritura
Edición
Borrado
Tratamiento de XML:
SAX
SAX simplificado
DOM
XMLPULL
Otras alternativas para leer y escribir XML
Notificaciones:
Toast
Barra de Estado
Diálogos
Snackbar
Acceso a Servicios Web:
SOAP
REST
Tareas en Segundo Plano:
Thread y AsyncTask
IntentService
Depuración de Código:
Logging
Sensores, Comunicaciones e interconexión con dispositivos físicos (IoT):
GPS
Acelerómetro
Sensor de Huella dactilar
Sensor de proximidad
Sensor de iluminación
Sensor de temperatura
Bluetooth
Bluetooth 4.0
Cámara
NFC
Reconocimiento de Voz
Google Play Services
Localización geográfica usando los servicios de Google
Mapas en Android
Conexión con Google Drive
Admod (Publiciad en las apps)
Pasarela de pago PayPal
Uso de la Api de PayPal para poder hacer pagos en nuestras apps
Publicidad en la App
Inclusión de Admob en nuestras apps
Firebase para Android
Base de datos en tiempo real (RealTime DataBase)
Autentificación
Firebase Storage
Notificaciones Push
Publicación de Aplicación Google Play
Alta como desarrollador en google developer program.
Pasos para la publicación de una App
Marco Práctico:
En cada sesión de formación se desarrollará Apps con ejemplos de lo impartido que estará disponible para que el alumno pueda practicar en su casa.
A lo largo del curso se impartirá los conocimientos necesarios para que el alumno pueda crear su propia App. En este caso será la creación de aplicación de mensajería (SuperWhatsApp)
IoT (Internet de las cosas)
En esta formación impartiremos los principios básicos de IoT y crearemos apps que se comuniquen con dispositivos físicos. Estos dispositivos los desarrollaremos utilizando la plataforma de Arduino y sus complementos.
Horario
Lunes de 7:00 p.m. a 10:00 p.m.
Miércoles de 7:00 p.m. a 10:00 p.m.
Fecha de inicio
Lunes 11 de Diciembre de 2017
Duración del curso
Total: 72 horas
Tiempo: 3 meses
Frecuencia: 6 horas semanales (24 horas mensuales)
Inversión
Mensual: 360.00 soles
Total 3 meses: 1,080.00 soles
Forma de Pago
Bajo depósito en cuenta bancaria, máximo 3 días previo al inicio de cada mes (360.00 soles)
Banco: Interbank
Cuenta en moneda nacional: 637-3066861788
Código interbancario: 00363701306686178864
A nombre de: Edward Schwarz Moreno
DNI: 09564483
Contacto
Los interesados enviar un mail a la cuenta jmoreno@gctiperu.com con los siguientes datos:
Asunto: Curso de Desarrollo de Aplicaciones Móviles Bajo Android
Contenido del correo:
Nombre completo
Lugar de trabajo o estudio
Número de teléfono celular
Registro
Sólo se considerará a los 25 primeros que envíen correo electrónico adjuntando el comprobante por el depósito realizado dado que la capacidad del lugar es limitada. La metodología del curso seguirá siendo la misma que se ha venido aplicando a los tallares de MVC-JavaScript.
No se entregará comprobante por el pago mensual y no se hará entrega de certificado de asistencia al curso.
Blog de Luis Dueñas dedicado a la difusión del Desarrollo en Microsoft .NET, Visual Studio, WinForms, WebForms, MVC, ASP .NET, jQuery, AJAX, HTML5, JavaScript, Móviles, etc. Encontrarás Libros, Demos, Artículos Técnicos, Entrenamiento.
Mostrando las entradas con la etiqueta GridView. Mostrar todas las entradas
Mostrando las entradas con la etiqueta GridView. Mostrar todas las entradas
jueves, 30 de noviembre de 2017
Entrenamiento - 2do Curso de Desarrollo de Aplicaciones Móviles Bajo Android
Etiquetas:
Android,
CardView,
CheckBox,
Eduardo Monroy,
FileManager,
Fragments,
GridView,
IoT,
Layouts,
ListView,
Menús,
Notificaciones,
RadioButton,
RecyclerView,
Sensores,
Spinner,
Tabs,
ViewHolder,
Widgets,
XML
viernes, 24 de noviembre de 2017
El Manual del Día: Visual Web Developer Parte 2
MSDN - Manual de Visual Web Developer Parte 2
Titulo: Manual de Visual Web Developer Parte 2
Fuente Original: Microsoft Developer Network (MSDN)
Compilado Por: Luis Dueñas Huaroto (Lduenas)
Año de Compilación: 2008
Número de Páginas: 473
Indice del Manual de Visual Web Developer (Parte 2)
6. Introducción a la Infraestructura de ASP .NET
6.1. Información General sobre Controladores HTTP y Módulos HTTP
6.1.1. Cómo: Registrar Controladores HTTP
6.1.2. Cómo: Configurar una Extensión de Controlador HTTP en IIS
6.1.3. Tutorial: Crear un Controlador HTTP Sincrónico
6.1.4. Cómo: Crear un Controlador HTTP Asincrónico
6.1.5. Tutorial: Crear y Registrar Generadores de Controladores http
6.1.6. Tutorial: Crear y Registrar un Módulo HTTP Personalizado
6.2. Información General sobre la Administración de Estados de ASP .NET
6.2.1. Información General sobre las Cookies en ASP .NET
6.2.1.1. Cómo: Escribir una Cookie
6.2.1.2. Cómo: Leer una Cookie
6.2.1.3. Cómo: Eliminar una Cookie
6.2.2. Información General sobre el Estado de Vista en ASP .NET
6.2.3. Información General sobre el Estado de Sesión de ASP .NET
6.2.3.1. Identificadores de Sesión
6.2.3.2. Eventos de Estado de Sesión
6.2.3.3. Modos de Estado de Sesión
6.2.3.4. Proteger el Estado de Sesión
6.2.3.5. Cómo: Guardar Valores en un Estado de Sesión
6.2.3.6. Cómo: Leer los Valores de un Estado de Sesión
6.2.3.7. Implementar un Proveedor de Almacén de Estados de Sesión
6.2.4. Información General sobre el Estado de Aplicación de ASP .NET
6.2.4.1. Cómo: Guardar Valores en un Estado de Aplicación
6.2.4.2. Cómo: Leer los Valores de un Estado de Aplicación
6.2.5. Información General sobre las Propiedades de Perfil de ASP .NET
6.2.5.1. Identificación de Usuario para las Propiedades de Perfil de ASP .NET
6.2.5.2. Definición de las Propiedades de Perfil ASP .NET
6.2.5.3. Proveedores de Perfiles de ASP .NET
6.2.5.4. Proteger las Propiedades de Perfil
6.2.5.5. Tutorial: Mantener la Información de Usuarios de Sitios Web con Propiedades de Perfil
6.2.5.6. Usar Información de Perfiles con AJAX en ASP .NET
6.2.5.7. Implementar un Proveedor de Perfiles
6.2.5.8. Información General sobre el Servicio de Perfiles de WCF
6.2.5.8.1. Cómo: Habilitar el Servicio de Perfiles de WCF
6.2.6. Recomendaciones de Administración de Estado de ASP .NET
6.3. Enrutamiento de ASP .NET
6.3.1. Cómo: Definir una Ruta
6.3.2. Cómo: Crear una Dirección URL a partir de una Ruta
6.3.3. Cómo: Utilizar el Enrutamiento con Formularios Web
7. Utilizar Controles de ASP .NET
7.1. Controles de Usuario ASP .NET
7.1.1. Información General sobre los Controles de Usuario ASP .NET
7.1.2. Cómo: Convertir Páginas de Formularios Web Forms en Controles de Usuario
7.1.3. Cómo: Incluir un Control de Usuario en una Página Web ASP .NET
7.1.4. Cómo: Crear Instancias de Controles de Usuario ASP .NET mediante Programación
7.1.5. Cómo: Crear Controles de Usuario ASP .NET con Plantillas
7.1.6. Cómo: Crear Controles de Usuario ASP .NET
7.1.7. Cómo: Incluir Controles de Usuario ASP .NET en Páginas Web
7.1.8. Tutorial: Crear Elementos Reutilizables con Controles Usuario ASP .NET
7.2. Controles de Servidor ASP .NET
7.2.1. Información General sobre los Controles de Servidor Web ASP .NET
7.2.1.1. Cómo: Agregar Controles de Servidor Web a una Página de Formularios Web Forms mediante el Diseñador de Web Forms
7.2.1.1.1. Cómo: Agregar Controles de Servidor a una Página Web ASP .NET mediante la Sintaxis de ASP .NET
7.2.1.2. Cómo: Crear Plantillas de Controles de Servidor Web mediante el Diseñador
7.2.1.3. Cómo: Establecer las Propiedades de Estilo de un Control de Servidor ASP .NET en el Diseñador
7.2.1.4. Cómo: Establecer Propiedades de un Control de Servidor ASP .NET
7.2.2. Trabajar con Controles de Servidor Web ASP .NET
7.2.2.1. Cómo: Agregar Controles de Servidor a una Página Web ASP .NET mediante la Sintaxis de ASP .NET
7.2.2.2. Agregar Controles de Servidor HTML a una Página Web ASP .NET
7.2.2.2.1. Cómo: Agregar Controles de Servidor HTML a una Página Web mediante la Sintaxis de ASP .NET
7.2.2.2.2. Cómo: Convertir Controles de Servidor HTML en Elementos HTML
7.2.2.3. Cómo: Especificar si los Controles de Servidor Web ASP .NET se Publican en el Servidor
7.2.2.4. Controles de Servidor Web y Funciones del Explorador
7.2.2.4.1. Proteger Archivos de Definición de Explorador
7.2.2.5. Orden de Tabulación, Foco y Claves de Acceso en los Controles de Servidor Web de ASP .NET
7.2.2.5.1. Cómo: Establecer el Foco en los Controles de Servidor Web
7.2.2.5.2. Cómo: Establecer Teclas de Acceso para los Controles de Servidor Web
7.2.2.6. Controles de Servidor Web ASP .NET y Estilos de CSS
7.2.2.6.1. Cómo: Establecer Propiedades de Estilo de un Control de Servidor ASP .NET mediante Sintaxis de ASP .NET
7.2.2.6.2. Cómo: Establecer Propiedades de Estilo de un Control de Servidor ASP .NET mediante Programación
7.2.2.7. Plantillas de Controles de Servidor Web ASP .NET
7.2.2.7.1. Cómo: Crear Plantillas de Controles Web ASP .NET mediante Declaración
7.2.2.7.2. Cómo: Responder a Eventos Button en Controles Enlazados a Datos
7.2.2.7.3. Cómo: Crear Plantillas de Controles de Servidor Web ASP .NET Dinámicamente
7.2.2.8. Agregar Controles ASP .NET mediante Programación
7.2.2.8.1. Cómo: Agregar Controles a una Página Web ASP .NET mediante Programación
7.2.2.8.2. Controles de Servidor Web Dinámicos y Estado de Vista
7.2.2.9. Obtener Acceso a Controles ASP .NET mediante Programación
7.2.2.9.1. Identificación de Controles de Formularios Web Forms
7.2.2.9.2. Resolución del Identificador de un Control de Formularios Web Forms
7.2.2.9.3. Cómo: Localizar Controles Secundarios por Id en una Página Web
7.2.2.9.4. Utilizar una Colección de Controles en una Página Web
7.2.2.9.5. Cómo: Buscar Controles de Formularios Web Forms en una Página recorriendo la Colección Controls
7.2.2.9.6. Utilizar la Propiedad NamingContainer para Determinar el Contenedor de Nombres de un Control
7.2.2.9.7. Cómo: Obtener Acceso a Miembros de un Contenedor de Nombres de un Control de Servidor Web
7.2.3. Controles Estándar del Cuadro de Herramientas
7.2.3.1. Información General sobre AdRotator
7.2.3.1.1. Tutorial: Mostrar y Realizar un Seguimiento de los Anuncios con el Control AdRotator
7.2.3.1.2. Cómo: Mostrar Anuncios desde un Archivo XML mediante el Control AdRotator
7.2.3.1.3. Cómo: Mostrar Anuncios desde una Base de Datos mediante el Control AdRotator
7.2.3.1.4. Cómo: Seleccionar Anuncios en un Control AdRotator mediante Programación
7.2.3.2. Información General sobre BulletedList
7.2.3.2.1. Cómo: Agregar Controles BulletedList a una Página
7.2.3.2.2. Cómo: Responder cuando el Usuario hace Clic en Controles BulletedList
7.2.3.3. Información General sobre Button
7.2.3.3.1. Cómo: Agregar Controles Button a una Página
7.2.3.3.2. Cómo: Agregar Controles ImageButton a una Página
7.2.3.3.3. Cómo: Determinar las Coordenadas de un Control ImageButton
7.2.3.3.4. Cómo: Responder a los Eventos de un Control Button
7.2.3.3.5. Cómo: Responder a los Eventos de un Control Button en una Secuencia de Comandos del Cliente
7.2.3.4. Información General sobre Calendar
7.2.3.4.1. Cómo: Controlar el Desplazamiento por Meses en el Control Calendar
7.2.3.4.2. Cómo: Controlar la Selección de Fecha del Usuario en un Control Calendar
7.2.3.4.3. Cómo: Personalizar la Apariencia del control Calendar
7.2.3.4.4. Cómo: Personalizar Días Aislados en un Control Calendar
7.2.3.4.5. Cómo: Dar Formato mediante Estilos a los Elementos del Control Calendar
7.2.3.4.6. Cómo: Responder a la Selección de Fecha en el Calendar
7.2.3.4.7. Cómo: Leer las Fechas Seleccionadas en Control Calendar
7.2.3.4.8. Cómo: Seleccionar Fechas mediante Programación en un Control Calendar
7.2.3.4.9. Cómo: Establecer la Fecha Actual mediante Programación en un Control Calendar
7.2.3.4.10. Cómo: Mostrar las Fechas Seleccionadas de una Base de Datos en el Control Calendar
7.2.3.5. Información General sobre CheckBox y CheckBoxList
7.2.3.5.1. Cómo: Agregar Controles CheckBox a una Página
7.2.3.5.2. Cómo: Agregar Controles CheckBoxList a una Página
7.2.3.5.3. Cómo: Configurar las Opciones de Diseño de un Control CheckBoxList
7.2.3.5.4. Cómo: Obtener y Establecer el Valor de un Control CheckBox mediante Programación
7.2.3.5.5. Cómo: Responder a la Selección del Usuario en un Control CheckBox
7.2.3.6. Información General sobre DropDownList
7.2.3.6.1. Cómo: Agregar Controles DropDownList a una Página
7.2.3.7. Información General sobre FileUpload
7.2.3.7.1. Cómo: Cargar Archivos con el Control FileUpload
7.2.3.8. Información General sobre HiddenField
7.2.3.9. Información General sobre HyperLink
7.2.3.9.1. Cómo: Agregar Controles HyperLink a una Página
7.2.3.10. Información General sobre Image
7.2.3.10.1. Cómo: Agregar Controles Image a una Página
7.2.3.11. Información General sobre ImageMap
7.2.3.11.1. Cómo: Agregar Controles ImageMap a una Página
7.2.3.11.2. Cómo: Responder Cuando el Usuario hace Clic en Controles ImageMap
7.2.3.12. Información General sobre Label
7.2.3.12.1. Cómo: Agregar Controles Label a una Página
7.2.3.12.2. Cómo: Utilizar controles Label como Títulos
7.2.3.13. Información General sobre ListBox
7.2.3.13.1. Cómo: Agregar Controles ListBox a una Página
7.2.3.13.2. Cómo: Agregar Elementos a Controles List
7.2.3.13.3. Cómo: Establecer la Selección en Controles List
7.2.3.13.4. Cómo: Rellenar Controles List desde un Origen de Datos
7.2.3.13.5. Cómo: Responder a los Cambios en Controles List
7.2.3.13.6. Cómo: Determinar la Selección en Controles List
7.2.3.14. Información General sobre Literal
7.2.3.14.1. Cómo: Agregar Controles Literal a una Página
7.2.3.15. Información General sobre el Control Localize
7.2.3.15.1. Cómo: Agregar Controles Localize a las Páginas
7.2.3.16. Información General sobre MultiView y View
7.2.3.16.1. Cómo: Agregar Controles MultiView a una Página
7.2.3.17. Información General sobre Panel
7.2.3.17.1. Cómo: Agregar Controles Panel a una Página
7.2.3.18. Información General sobre PlaceHolder
7.2.3.18.1. Cómo: Agregar Controles PlaceHolder a una Página
7.2.3.19. Información General sobre RadioButton y RadioButtonList
7.2.3.19.1. Cómo: Agregar Controles RadioButton a una Página
7.2.3.19.2. Cómo: Agregar Controles RadioButtonList a una Página
7.2.3.19.3. Cómo: Establecer y Obtener la Selección de un Control RadioButton
7.2.3.19.4. Cómo: Configurar las Opciones de Diseño de un Control RadioButtonList
7.2.3.19.5. Cómo: Responder a la Selección de un Usuario en un Grupo de Controles RadioButton
7.2.3.20. Información General sobre el Control Substitution
7.2.3.21. Información General sobre los Controles Table, TableRow y TableCell
7.2.3.21.1. Cómo: Agregar Controles Table a una Página
7.2.3.21.2. Cómo: Agregar Filas y Celdas Dinámicamente a un Control Table
7.2.3.22. Información General sobre TextBox
7.2.3.22.1. Cómo: Obtener y Establecer los Valores de los Controles TextBox
7.2.3.22.2. Cómo: Establecer un Control TextBox para Escribir Contraseñas
7.2.3.22.3. Cómo: Especificar la Entrada de Varias Líneas de Datos en un Control TextBox
7.2.3.22.4. Cómo: Responder a los Cambios en un Control TextBox
7.2.3.23. Información General sobre Wizard
7.2.3.23.1. Tutorial: Crear un Control ASP .NET Wizard Básico
7.2.3.23.2. Tutorial: Uso Avanzado del Control Wizard de ASP .NET
7.2.3.24. Información General sobre el Control XML
7.2.3.24.1. Cómo: Agregar Controles XML a una Página
7.2.3.24.2. Cómo: Cargar Datos XML en el Control XML
7.2.3.24.3. Cómo: Transformar Datos XML en el Control XML
7.2.3.24.4. Tutorial: Mostrar un Documento XML en una Página mediante Transformaciones
7.2.3.25. Seguridad de Controles Estándar
7.2.4. Controles de Datos del Cuadro de Herramientas
7.2.4.1. Controles de Servidor Web de Datos
7.2.4.1.1. Información General sobre los Controles Enlazados a Datos
7.2.4.1.2. Información General sobre el Control ListView
7.2.4.1.2.1. Tutorial: Mostrar, Paginar y Ordenar Datos con el Control ListView
7.2.4.1.2.2. Tutorial: Modificar Datos con el Control ListView
7.2.4.1.3. Información General sobre el Control GridView
7.2.4.1.3.1. Comparar los Controles GridView y DataGrid
7.2.4.1.3.2. Ordenar los Datos de un Control GridView
7.2.4.1.3.3. Paginación en un Control GridView
7.2.4.1.3.4. Modificar los Datos de un Control GridView
7.2.4.1.3.5. Eventos del Control GridView
7.2.4.1.3.6. Crear una Columna Personalizada en un Control GridView
7.2.4.1.3.7. Cómo: Establecer Dinámicamente el Ancho de las Columnas en el Control GridView
7.2.4.1.3.8. Cómo: Habilitar la Paginación Predeterminada en el Control GridView
7.2.4.1.3.9. Cómo: Habilitar la Edición Predeterminada en el Control GridView
7.2.4.1.3.10. Cómo: Habilitar la Selección Predeterminada en el Control GridView
7.2.4.1.3.11. Cómo: Habilitar la Eliminación Predeterminada en el Control GridView
7.2.4.1.3.12. Cómo: Personalizar Controles para la Edición en el Control de GridView
7.2.4.1.3.13. Cómo: Responder a Eventos de Botón en un Control GridView
7.2.4.1.3.14. Tutorial: Mostrar una Lista Desplegable mientras se Edita en el Control de GridView
7.2.4.1.3.15. Tutorial: Ordenación Simple del Control GridView
7.2.4.1.3.16. Tutorial: Realizar Actualizaciones Masivas en Filas Enlazadas a un Control GridView
7.2.4.1.3.17. Tutorial: Crear un Control GridView Anidado
7.2.4.1.3.18. Tutorial: Mostrar Datos mediante un Procedimiento Almacenado en el Control GridView
7.2.4.1.4. Información General sobre DetailsView
7.2.4.1.4.1. Paginación en un Control DetailsView
7.2.4.1.4.2. Modificar Datos mediante un Control DetailsView
7.2.4.1.4.3. Crear una Fila Personalizada en un DetailsView
7.2.4.1.4.4. Eventos del Control DetailsView
7.2.4.1.5. Información General sobre FormView
7.2.4.1.5.1. Crear Plantillas para el Control FormView
7.2.4.1.5.2. Paginación en un Control FormView
7.2.4.1.5.3. Modificar Datos mediante un Control FormView
7.2.4.1.5.4. Eventos del Control FormView
7.2.4.1.5.5. Tutorial: Mostrar Datos con Formato en Páginas Web con el Control FormView
7.2.4.1.6. Información General sobre Repeater
7.2.4.1.6.1. Cómo: Agregar Controles Repeater a una Página
7.2.4.1.7. Información General sobre DataList
7.2.4.1.7.1. Cómo: Especificar el Formato de Flujo o Tabla en Controles DataList
7.2.4.1.7.2. Cómo: Especificar la Disposición Horizontal o Vertical en los Controles DataList
7.2.4.1.7.3. Cómo: Permitir que los Usuarios Seleccionen Elementos en los Controles DataList
7.2.4.1.7.4. Cómo: Permitir que los Usuarios Editen Elementos en Controles DataList
7.2.4.1.7.5. Cómo: Permitir a los Usuarios Eliminar Elementos en Controles DataList
7.2.4.1.7.6. Cómo: Responder a los Eventos de Botón en Elementos DataList o Repeater
7.2.4.1.7.7. Cómo: Personalizar Elementos DataList en Tiempo de Ejecución
7.2.4.1.7.8. Cómo: Personalizar Elementos Dinámicamente en el Control DataList
7.2.4.1.7.9. Cómo: Crear Plantillas Dinámicamente en los Controles DataList
7.2.4.1.7.10. Cómo: Agregar Controles DataList a una Página
7.2.4.1.7.11. Tutorial: Mostrar y Dar Formato a Datos con el Control DataList
7.2.4.2. Controles de Servidor Web de Orígenes de Datos
7.2.4.2.1. Información General sobre los Controles de Origen de Datos
7.2.4.2.2. Establecer Enlaces a Datos utilizando un Control de Origen de Datos
7.2.4.2.3. Utilizar Parámetros con Controles de Origen de Datos
7.2.4.2.3.1. Cómo un Control de Origen de Datos Crea Parámetros para Campos Enlazados a Datos
7.2.4.2.4. Ordenar Datos con Controles de Origen de Datos
7.2.4.2.5. Modificar Datos mediante Controles de Origen de Datos
7.2.4.2.6. Filtrar Datos utilizando Controles de Origen de Datos
7.2.4.2.7. Almacenar Datos en Memoria Caché utilizando Controles de Origen de Datos
7.2.4.2.8. Controlar Valores Null de Base de Datos mediante Controles de Origen de Datos
7.2.4.2.9. Información General sobre el Control LinqDataSource
7.2.4.2.9.1. Tutorial: Recuperar, Actualizar, Insertar y Eliminar Datos con los Controles LinqDataSource y DetailsView
7.2.4.2.9.2. Tutorial: Seleccionar y Filtrar un Subconjunto de Datos con los Controles LinqDataSource y GridView
7.2.4.2.9.3. Tutorial: Usar una Marca de Tiempo con el Control LinqDataSource para Comprobar la Integridad de los Datos
7.2.4.2.9.4. Cómo: Agrupar y Agregar Datos utilizando el Control LinqDataSource
7.2.4.2.9.5. Cómo: Actualizar, Insertar y Eliminar Datos con el Control LinqDataSource
7.2.4.2.10. Información General sobre SqlDataSource
7.2.4.2.10.1. Seleccionar Datos mediante el Control SqlDataSource
7.2.4.2.10.2. Utilizar Parámetros con el Control SqlDataSource
7.2.4.2.10.3. Modificar Datos mediante el Control SqlDataSource
7.2.4.2.10.4. Almacenar Datos en Caché con el Control SqlDataSource
7.2.4.2.10.5. Cómo: Habilitar el Filtrado para el Control SqlDataSource
7.2.4.2.10.6. Cómo: Conectar con una Base de Datos de SQL Server mediante el Control SqlDataSource
7.2.4.2.10.7. Cómo: Conectar con una Base de Datos de Access mediante el Control SqlDataSource
7.2.4.2.10.8. Cómo: Conectar con una Base de Datos ODBC mediante el Control SqlDataSource
7.2.4.2.10.9. Cómo: Conectar con una Base de Datos de Oracle mediante el Control SqlDataSource
7.2.4.2.11. Información General sobre el Control AccessDataSource
7.2.4.2.11.1. Recuperar Datos utilizando el Control AccessDataSource
7.2.4.2.11.2. Cómo: Conectar con una Base de Datos de Access mediante el Control AccessDataSource
7.2.4.2.12. Información General sobre el Control ObjectDataSource
7.2.4.2.12.1. Utilizar Parámetros con el Control ObjectDataSource
7.2.4.2.12.2. Tutorial: Enlace de Datos en Páginas Web con un Componente de Datos
7.2.4.2.12.3. Crear un Objeto de Origen para un Control ObjectDataSource
7.2.4.2.12.3.1. Ejemplo de Objeto de Origen ObjectDataSource
7.2.4.2.12.3.2. Ejemplo de ObjectDataSource con Establecimiento Inflexible de Tipos
7.2.4.2.13. Información General sobre el Control XmlDataSource
7.2.4.2.13.1. Filtrar Datos mediante el Control XmlDataSource
7.2.4.2.13.2. Enlazar un Control Tabular con XmlDataSource
7.2.4.2.13.3. Tutorial: Crear una Página Web para Mostrar Datos XML
7.2.4.2.14. Información General sobre SiteMapDataSource
Descarga
Manual_Visual_Web_Developer_Parte2
Titulo: Manual de Visual Web Developer Parte 2
Fuente Original: Microsoft Developer Network (MSDN)
Compilado Por: Luis Dueñas Huaroto (Lduenas)
Año de Compilación: 2008
Número de Páginas: 473
Indice del Manual de Visual Web Developer (Parte 2)
6. Introducción a la Infraestructura de ASP .NET
6.1. Información General sobre Controladores HTTP y Módulos HTTP
6.1.1. Cómo: Registrar Controladores HTTP
6.1.2. Cómo: Configurar una Extensión de Controlador HTTP en IIS
6.1.3. Tutorial: Crear un Controlador HTTP Sincrónico
6.1.4. Cómo: Crear un Controlador HTTP Asincrónico
6.1.5. Tutorial: Crear y Registrar Generadores de Controladores http
6.1.6. Tutorial: Crear y Registrar un Módulo HTTP Personalizado
6.2. Información General sobre la Administración de Estados de ASP .NET
6.2.1. Información General sobre las Cookies en ASP .NET
6.2.1.1. Cómo: Escribir una Cookie
6.2.1.2. Cómo: Leer una Cookie
6.2.1.3. Cómo: Eliminar una Cookie
6.2.2. Información General sobre el Estado de Vista en ASP .NET
6.2.3. Información General sobre el Estado de Sesión de ASP .NET
6.2.3.1. Identificadores de Sesión
6.2.3.2. Eventos de Estado de Sesión
6.2.3.3. Modos de Estado de Sesión
6.2.3.4. Proteger el Estado de Sesión
6.2.3.5. Cómo: Guardar Valores en un Estado de Sesión
6.2.3.6. Cómo: Leer los Valores de un Estado de Sesión
6.2.3.7. Implementar un Proveedor de Almacén de Estados de Sesión
6.2.4. Información General sobre el Estado de Aplicación de ASP .NET
6.2.4.1. Cómo: Guardar Valores en un Estado de Aplicación
6.2.4.2. Cómo: Leer los Valores de un Estado de Aplicación
6.2.5. Información General sobre las Propiedades de Perfil de ASP .NET
6.2.5.1. Identificación de Usuario para las Propiedades de Perfil de ASP .NET
6.2.5.2. Definición de las Propiedades de Perfil ASP .NET
6.2.5.3. Proveedores de Perfiles de ASP .NET
6.2.5.4. Proteger las Propiedades de Perfil
6.2.5.5. Tutorial: Mantener la Información de Usuarios de Sitios Web con Propiedades de Perfil
6.2.5.6. Usar Información de Perfiles con AJAX en ASP .NET
6.2.5.7. Implementar un Proveedor de Perfiles
6.2.5.8. Información General sobre el Servicio de Perfiles de WCF
6.2.5.8.1. Cómo: Habilitar el Servicio de Perfiles de WCF
6.2.6. Recomendaciones de Administración de Estado de ASP .NET
6.3. Enrutamiento de ASP .NET
6.3.1. Cómo: Definir una Ruta
6.3.2. Cómo: Crear una Dirección URL a partir de una Ruta
6.3.3. Cómo: Utilizar el Enrutamiento con Formularios Web
7. Utilizar Controles de ASP .NET
7.1. Controles de Usuario ASP .NET
7.1.1. Información General sobre los Controles de Usuario ASP .NET
7.1.2. Cómo: Convertir Páginas de Formularios Web Forms en Controles de Usuario
7.1.3. Cómo: Incluir un Control de Usuario en una Página Web ASP .NET
7.1.4. Cómo: Crear Instancias de Controles de Usuario ASP .NET mediante Programación
7.1.5. Cómo: Crear Controles de Usuario ASP .NET con Plantillas
7.1.6. Cómo: Crear Controles de Usuario ASP .NET
7.1.7. Cómo: Incluir Controles de Usuario ASP .NET en Páginas Web
7.1.8. Tutorial: Crear Elementos Reutilizables con Controles Usuario ASP .NET
7.2. Controles de Servidor ASP .NET
7.2.1. Información General sobre los Controles de Servidor Web ASP .NET
7.2.1.1. Cómo: Agregar Controles de Servidor Web a una Página de Formularios Web Forms mediante el Diseñador de Web Forms
7.2.1.1.1. Cómo: Agregar Controles de Servidor a una Página Web ASP .NET mediante la Sintaxis de ASP .NET
7.2.1.2. Cómo: Crear Plantillas de Controles de Servidor Web mediante el Diseñador
7.2.1.3. Cómo: Establecer las Propiedades de Estilo de un Control de Servidor ASP .NET en el Diseñador
7.2.1.4. Cómo: Establecer Propiedades de un Control de Servidor ASP .NET
7.2.2. Trabajar con Controles de Servidor Web ASP .NET
7.2.2.1. Cómo: Agregar Controles de Servidor a una Página Web ASP .NET mediante la Sintaxis de ASP .NET
7.2.2.2. Agregar Controles de Servidor HTML a una Página Web ASP .NET
7.2.2.2.1. Cómo: Agregar Controles de Servidor HTML a una Página Web mediante la Sintaxis de ASP .NET
7.2.2.2.2. Cómo: Convertir Controles de Servidor HTML en Elementos HTML
7.2.2.3. Cómo: Especificar si los Controles de Servidor Web ASP .NET se Publican en el Servidor
7.2.2.4. Controles de Servidor Web y Funciones del Explorador
7.2.2.4.1. Proteger Archivos de Definición de Explorador
7.2.2.5. Orden de Tabulación, Foco y Claves de Acceso en los Controles de Servidor Web de ASP .NET
7.2.2.5.1. Cómo: Establecer el Foco en los Controles de Servidor Web
7.2.2.5.2. Cómo: Establecer Teclas de Acceso para los Controles de Servidor Web
7.2.2.6. Controles de Servidor Web ASP .NET y Estilos de CSS
7.2.2.6.1. Cómo: Establecer Propiedades de Estilo de un Control de Servidor ASP .NET mediante Sintaxis de ASP .NET
7.2.2.6.2. Cómo: Establecer Propiedades de Estilo de un Control de Servidor ASP .NET mediante Programación
7.2.2.7. Plantillas de Controles de Servidor Web ASP .NET
7.2.2.7.1. Cómo: Crear Plantillas de Controles Web ASP .NET mediante Declaración
7.2.2.7.2. Cómo: Responder a Eventos Button en Controles Enlazados a Datos
7.2.2.7.3. Cómo: Crear Plantillas de Controles de Servidor Web ASP .NET Dinámicamente
7.2.2.8. Agregar Controles ASP .NET mediante Programación
7.2.2.8.1. Cómo: Agregar Controles a una Página Web ASP .NET mediante Programación
7.2.2.8.2. Controles de Servidor Web Dinámicos y Estado de Vista
7.2.2.9. Obtener Acceso a Controles ASP .NET mediante Programación
7.2.2.9.1. Identificación de Controles de Formularios Web Forms
7.2.2.9.2. Resolución del Identificador de un Control de Formularios Web Forms
7.2.2.9.3. Cómo: Localizar Controles Secundarios por Id en una Página Web
7.2.2.9.4. Utilizar una Colección de Controles en una Página Web
7.2.2.9.5. Cómo: Buscar Controles de Formularios Web Forms en una Página recorriendo la Colección Controls
7.2.2.9.6. Utilizar la Propiedad NamingContainer para Determinar el Contenedor de Nombres de un Control
7.2.2.9.7. Cómo: Obtener Acceso a Miembros de un Contenedor de Nombres de un Control de Servidor Web
7.2.3. Controles Estándar del Cuadro de Herramientas
7.2.3.1. Información General sobre AdRotator
7.2.3.1.1. Tutorial: Mostrar y Realizar un Seguimiento de los Anuncios con el Control AdRotator
7.2.3.1.2. Cómo: Mostrar Anuncios desde un Archivo XML mediante el Control AdRotator
7.2.3.1.3. Cómo: Mostrar Anuncios desde una Base de Datos mediante el Control AdRotator
7.2.3.1.4. Cómo: Seleccionar Anuncios en un Control AdRotator mediante Programación
7.2.3.2. Información General sobre BulletedList
7.2.3.2.1. Cómo: Agregar Controles BulletedList a una Página
7.2.3.2.2. Cómo: Responder cuando el Usuario hace Clic en Controles BulletedList
7.2.3.3. Información General sobre Button
7.2.3.3.1. Cómo: Agregar Controles Button a una Página
7.2.3.3.2. Cómo: Agregar Controles ImageButton a una Página
7.2.3.3.3. Cómo: Determinar las Coordenadas de un Control ImageButton
7.2.3.3.4. Cómo: Responder a los Eventos de un Control Button
7.2.3.3.5. Cómo: Responder a los Eventos de un Control Button en una Secuencia de Comandos del Cliente
7.2.3.4. Información General sobre Calendar
7.2.3.4.1. Cómo: Controlar el Desplazamiento por Meses en el Control Calendar
7.2.3.4.2. Cómo: Controlar la Selección de Fecha del Usuario en un Control Calendar
7.2.3.4.3. Cómo: Personalizar la Apariencia del control Calendar
7.2.3.4.4. Cómo: Personalizar Días Aislados en un Control Calendar
7.2.3.4.5. Cómo: Dar Formato mediante Estilos a los Elementos del Control Calendar
7.2.3.4.6. Cómo: Responder a la Selección de Fecha en el Calendar
7.2.3.4.7. Cómo: Leer las Fechas Seleccionadas en Control Calendar
7.2.3.4.8. Cómo: Seleccionar Fechas mediante Programación en un Control Calendar
7.2.3.4.9. Cómo: Establecer la Fecha Actual mediante Programación en un Control Calendar
7.2.3.4.10. Cómo: Mostrar las Fechas Seleccionadas de una Base de Datos en el Control Calendar
7.2.3.5. Información General sobre CheckBox y CheckBoxList
7.2.3.5.1. Cómo: Agregar Controles CheckBox a una Página
7.2.3.5.2. Cómo: Agregar Controles CheckBoxList a una Página
7.2.3.5.3. Cómo: Configurar las Opciones de Diseño de un Control CheckBoxList
7.2.3.5.4. Cómo: Obtener y Establecer el Valor de un Control CheckBox mediante Programación
7.2.3.5.5. Cómo: Responder a la Selección del Usuario en un Control CheckBox
7.2.3.6. Información General sobre DropDownList
7.2.3.6.1. Cómo: Agregar Controles DropDownList a una Página
7.2.3.7. Información General sobre FileUpload
7.2.3.7.1. Cómo: Cargar Archivos con el Control FileUpload
7.2.3.8. Información General sobre HiddenField
7.2.3.9. Información General sobre HyperLink
7.2.3.9.1. Cómo: Agregar Controles HyperLink a una Página
7.2.3.10. Información General sobre Image
7.2.3.10.1. Cómo: Agregar Controles Image a una Página
7.2.3.11. Información General sobre ImageMap
7.2.3.11.1. Cómo: Agregar Controles ImageMap a una Página
7.2.3.11.2. Cómo: Responder Cuando el Usuario hace Clic en Controles ImageMap
7.2.3.12. Información General sobre Label
7.2.3.12.1. Cómo: Agregar Controles Label a una Página
7.2.3.12.2. Cómo: Utilizar controles Label como Títulos
7.2.3.13. Información General sobre ListBox
7.2.3.13.1. Cómo: Agregar Controles ListBox a una Página
7.2.3.13.2. Cómo: Agregar Elementos a Controles List
7.2.3.13.3. Cómo: Establecer la Selección en Controles List
7.2.3.13.4. Cómo: Rellenar Controles List desde un Origen de Datos
7.2.3.13.5. Cómo: Responder a los Cambios en Controles List
7.2.3.13.6. Cómo: Determinar la Selección en Controles List
7.2.3.14. Información General sobre Literal
7.2.3.14.1. Cómo: Agregar Controles Literal a una Página
7.2.3.15. Información General sobre el Control Localize
7.2.3.15.1. Cómo: Agregar Controles Localize a las Páginas
7.2.3.16. Información General sobre MultiView y View
7.2.3.16.1. Cómo: Agregar Controles MultiView a una Página
7.2.3.17. Información General sobre Panel
7.2.3.17.1. Cómo: Agregar Controles Panel a una Página
7.2.3.18. Información General sobre PlaceHolder
7.2.3.18.1. Cómo: Agregar Controles PlaceHolder a una Página
7.2.3.19. Información General sobre RadioButton y RadioButtonList
7.2.3.19.1. Cómo: Agregar Controles RadioButton a una Página
7.2.3.19.2. Cómo: Agregar Controles RadioButtonList a una Página
7.2.3.19.3. Cómo: Establecer y Obtener la Selección de un Control RadioButton
7.2.3.19.4. Cómo: Configurar las Opciones de Diseño de un Control RadioButtonList
7.2.3.19.5. Cómo: Responder a la Selección de un Usuario en un Grupo de Controles RadioButton
7.2.3.20. Información General sobre el Control Substitution
7.2.3.21. Información General sobre los Controles Table, TableRow y TableCell
7.2.3.21.1. Cómo: Agregar Controles Table a una Página
7.2.3.21.2. Cómo: Agregar Filas y Celdas Dinámicamente a un Control Table
7.2.3.22. Información General sobre TextBox
7.2.3.22.1. Cómo: Obtener y Establecer los Valores de los Controles TextBox
7.2.3.22.2. Cómo: Establecer un Control TextBox para Escribir Contraseñas
7.2.3.22.3. Cómo: Especificar la Entrada de Varias Líneas de Datos en un Control TextBox
7.2.3.22.4. Cómo: Responder a los Cambios en un Control TextBox
7.2.3.23. Información General sobre Wizard
7.2.3.23.1. Tutorial: Crear un Control ASP .NET Wizard Básico
7.2.3.23.2. Tutorial: Uso Avanzado del Control Wizard de ASP .NET
7.2.3.24. Información General sobre el Control XML
7.2.3.24.1. Cómo: Agregar Controles XML a una Página
7.2.3.24.2. Cómo: Cargar Datos XML en el Control XML
7.2.3.24.3. Cómo: Transformar Datos XML en el Control XML
7.2.3.24.4. Tutorial: Mostrar un Documento XML en una Página mediante Transformaciones
7.2.3.25. Seguridad de Controles Estándar
7.2.4. Controles de Datos del Cuadro de Herramientas
7.2.4.1. Controles de Servidor Web de Datos
7.2.4.1.1. Información General sobre los Controles Enlazados a Datos
7.2.4.1.2. Información General sobre el Control ListView
7.2.4.1.2.1. Tutorial: Mostrar, Paginar y Ordenar Datos con el Control ListView
7.2.4.1.2.2. Tutorial: Modificar Datos con el Control ListView
7.2.4.1.3. Información General sobre el Control GridView
7.2.4.1.3.1. Comparar los Controles GridView y DataGrid
7.2.4.1.3.2. Ordenar los Datos de un Control GridView
7.2.4.1.3.3. Paginación en un Control GridView
7.2.4.1.3.4. Modificar los Datos de un Control GridView
7.2.4.1.3.5. Eventos del Control GridView
7.2.4.1.3.6. Crear una Columna Personalizada en un Control GridView
7.2.4.1.3.7. Cómo: Establecer Dinámicamente el Ancho de las Columnas en el Control GridView
7.2.4.1.3.8. Cómo: Habilitar la Paginación Predeterminada en el Control GridView
7.2.4.1.3.9. Cómo: Habilitar la Edición Predeterminada en el Control GridView
7.2.4.1.3.10. Cómo: Habilitar la Selección Predeterminada en el Control GridView
7.2.4.1.3.11. Cómo: Habilitar la Eliminación Predeterminada en el Control GridView
7.2.4.1.3.12. Cómo: Personalizar Controles para la Edición en el Control de GridView
7.2.4.1.3.13. Cómo: Responder a Eventos de Botón en un Control GridView
7.2.4.1.3.14. Tutorial: Mostrar una Lista Desplegable mientras se Edita en el Control de GridView
7.2.4.1.3.15. Tutorial: Ordenación Simple del Control GridView
7.2.4.1.3.16. Tutorial: Realizar Actualizaciones Masivas en Filas Enlazadas a un Control GridView
7.2.4.1.3.17. Tutorial: Crear un Control GridView Anidado
7.2.4.1.3.18. Tutorial: Mostrar Datos mediante un Procedimiento Almacenado en el Control GridView
7.2.4.1.4. Información General sobre DetailsView
7.2.4.1.4.1. Paginación en un Control DetailsView
7.2.4.1.4.2. Modificar Datos mediante un Control DetailsView
7.2.4.1.4.3. Crear una Fila Personalizada en un DetailsView
7.2.4.1.4.4. Eventos del Control DetailsView
7.2.4.1.5. Información General sobre FormView
7.2.4.1.5.1. Crear Plantillas para el Control FormView
7.2.4.1.5.2. Paginación en un Control FormView
7.2.4.1.5.3. Modificar Datos mediante un Control FormView
7.2.4.1.5.4. Eventos del Control FormView
7.2.4.1.5.5. Tutorial: Mostrar Datos con Formato en Páginas Web con el Control FormView
7.2.4.1.6. Información General sobre Repeater
7.2.4.1.6.1. Cómo: Agregar Controles Repeater a una Página
7.2.4.1.7. Información General sobre DataList
7.2.4.1.7.1. Cómo: Especificar el Formato de Flujo o Tabla en Controles DataList
7.2.4.1.7.2. Cómo: Especificar la Disposición Horizontal o Vertical en los Controles DataList
7.2.4.1.7.3. Cómo: Permitir que los Usuarios Seleccionen Elementos en los Controles DataList
7.2.4.1.7.4. Cómo: Permitir que los Usuarios Editen Elementos en Controles DataList
7.2.4.1.7.5. Cómo: Permitir a los Usuarios Eliminar Elementos en Controles DataList
7.2.4.1.7.6. Cómo: Responder a los Eventos de Botón en Elementos DataList o Repeater
7.2.4.1.7.7. Cómo: Personalizar Elementos DataList en Tiempo de Ejecución
7.2.4.1.7.8. Cómo: Personalizar Elementos Dinámicamente en el Control DataList
7.2.4.1.7.9. Cómo: Crear Plantillas Dinámicamente en los Controles DataList
7.2.4.1.7.10. Cómo: Agregar Controles DataList a una Página
7.2.4.1.7.11. Tutorial: Mostrar y Dar Formato a Datos con el Control DataList
7.2.4.2. Controles de Servidor Web de Orígenes de Datos
7.2.4.2.1. Información General sobre los Controles de Origen de Datos
7.2.4.2.2. Establecer Enlaces a Datos utilizando un Control de Origen de Datos
7.2.4.2.3. Utilizar Parámetros con Controles de Origen de Datos
7.2.4.2.3.1. Cómo un Control de Origen de Datos Crea Parámetros para Campos Enlazados a Datos
7.2.4.2.4. Ordenar Datos con Controles de Origen de Datos
7.2.4.2.5. Modificar Datos mediante Controles de Origen de Datos
7.2.4.2.6. Filtrar Datos utilizando Controles de Origen de Datos
7.2.4.2.7. Almacenar Datos en Memoria Caché utilizando Controles de Origen de Datos
7.2.4.2.8. Controlar Valores Null de Base de Datos mediante Controles de Origen de Datos
7.2.4.2.9. Información General sobre el Control LinqDataSource
7.2.4.2.9.1. Tutorial: Recuperar, Actualizar, Insertar y Eliminar Datos con los Controles LinqDataSource y DetailsView
7.2.4.2.9.2. Tutorial: Seleccionar y Filtrar un Subconjunto de Datos con los Controles LinqDataSource y GridView
7.2.4.2.9.3. Tutorial: Usar una Marca de Tiempo con el Control LinqDataSource para Comprobar la Integridad de los Datos
7.2.4.2.9.4. Cómo: Agrupar y Agregar Datos utilizando el Control LinqDataSource
7.2.4.2.9.5. Cómo: Actualizar, Insertar y Eliminar Datos con el Control LinqDataSource
7.2.4.2.10. Información General sobre SqlDataSource
7.2.4.2.10.1. Seleccionar Datos mediante el Control SqlDataSource
7.2.4.2.10.2. Utilizar Parámetros con el Control SqlDataSource
7.2.4.2.10.3. Modificar Datos mediante el Control SqlDataSource
7.2.4.2.10.4. Almacenar Datos en Caché con el Control SqlDataSource
7.2.4.2.10.5. Cómo: Habilitar el Filtrado para el Control SqlDataSource
7.2.4.2.10.6. Cómo: Conectar con una Base de Datos de SQL Server mediante el Control SqlDataSource
7.2.4.2.10.7. Cómo: Conectar con una Base de Datos de Access mediante el Control SqlDataSource
7.2.4.2.10.8. Cómo: Conectar con una Base de Datos ODBC mediante el Control SqlDataSource
7.2.4.2.10.9. Cómo: Conectar con una Base de Datos de Oracle mediante el Control SqlDataSource
7.2.4.2.11. Información General sobre el Control AccessDataSource
7.2.4.2.11.1. Recuperar Datos utilizando el Control AccessDataSource
7.2.4.2.11.2. Cómo: Conectar con una Base de Datos de Access mediante el Control AccessDataSource
7.2.4.2.12. Información General sobre el Control ObjectDataSource
7.2.4.2.12.1. Utilizar Parámetros con el Control ObjectDataSource
7.2.4.2.12.2. Tutorial: Enlace de Datos en Páginas Web con un Componente de Datos
7.2.4.2.12.3. Crear un Objeto de Origen para un Control ObjectDataSource
7.2.4.2.12.3.1. Ejemplo de Objeto de Origen ObjectDataSource
7.2.4.2.12.3.2. Ejemplo de ObjectDataSource con Establecimiento Inflexible de Tipos
7.2.4.2.13. Información General sobre el Control XmlDataSource
7.2.4.2.13.1. Filtrar Datos mediante el Control XmlDataSource
7.2.4.2.13.2. Enlazar un Control Tabular con XmlDataSource
7.2.4.2.13.3. Tutorial: Crear una Página Web para Mostrar Datos XML
7.2.4.2.14. Información General sobre SiteMapDataSource
Descarga
Manual_Visual_Web_Developer_Parte2
Etiquetas:
AJAX,
ASP.NET,
Controladores,
Controles,
Cookies,
Enrutamiento,
GridView,
HTTP,
Lduenas,
Manual,
Módulos,
MSDN,
Perfiles,
Plantillas,
Sesión,
Vista,
WCF,
Web Developer,
Web Forms,
XML
lunes, 2 de febrero de 2015
Entrenamiento - Fotos del Ultimo Seminario
Fotos del Ultimo Seminario
Antes que nada agradecer a todos los asistentes al último seminario de .NET: "Creación de Librería de Controles con .NET" y también agradecer a la empresa HTE por organizar el evento. Comparto algunas fotos para que las publiquen en sus Redes Sociales.
Mas fotos ver en el siguiente enlace:
Fotos Facebook HTE
Los Demos del seminario se los estoy enviando en unos momentos.
Antes que nada agradecer a todos los asistentes al último seminario de .NET: "Creación de Librería de Controles con .NET" y también agradecer a la empresa HTE por organizar el evento. Comparto algunas fotos para que las publiquen en sus Redes Sociales.
Mas fotos ver en el siguiente enlace:
Fotos Facebook HTE
Los Demos del seminario se los estoy enviando en unos momentos.
Etiquetas:
.NET,
ASP.NET,
C#,
Composite Control,
Controles,
Entrenamiento,
Facebook,
Fotos,
GridView,
HTE,
Lduenas,
Librerías,
Ordenar,
Paginar,
Reflection,
Seminarios,
Taller,
UserControl,
WebControl,
WebForms
miércoles, 21 de enero de 2015
Entrenamiento - Cuarto Seminario de .NET (Creación de Controles en ASP.NET)
Cuarto Seminario de .NET: Creación de Librerías de Controles en ASP.NET
Un saludo cordial a todos los visitantes del Blog y anunciar que este Miércoles 28 de Enero tendremos el cuarto y último seminario de .NET, que en esta ocasión tratará sobre como crear Librerías de Controles en ASP.NET, tanto en WebForms como en MVC.
Muchos desarrolladores de WebForms solo crean Controles de Usuario (User Controls) que solo son reusables dentro de una aplicación web, pero si lo quieren usar en otras aplicaciones tienen que copiar el código fuente y eso no es reusabilidad, lo correcto es crear su Librería de Controles Web que contengan clases WebControls o CompositeControls.
Lo mismo sucede en MVC, si queremos trabajar con grillas, gráficos, reportes, Microsoft solo ofrece los controles HTML Helpers que son limitados, por lo cual, muchos programadores recurren a librerías de terceros como jQueryUI, KendoUI, Infragistics, DevExpress, etc. También veremos como podemos aumentar controles a los HTML Helpers de MVC.
Les dejo la propaganda a los interesados:
También publico una foto de la tercera charla sobre Reflection y Creación de Controles WinForms.
No se olviden confirmar su asistencia mediante un mail a Luis.duenash@gmail.com e informes@hte.com.pe.
Los dejo con una frase para que reflexionen: "La grandeza de un país se ve por la cantidad de gente culta que en el habita". Si queremos ser un país desarrollado o del primer mundo, necesitamos invertir mas tiempo en nuestra profesión y cultura; no solo hay que ir a trabajar y cumplir con lo que uno puede, sino, hay que hacer el mejor trabajo (como nadie lo haría) y para eso hay que invertir en nuestro conocimiento.
Un saludo cordial a todos los visitantes del Blog y anunciar que este Miércoles 28 de Enero tendremos el cuarto y último seminario de .NET, que en esta ocasión tratará sobre como crear Librerías de Controles en ASP.NET, tanto en WebForms como en MVC.
Muchos desarrolladores de WebForms solo crean Controles de Usuario (User Controls) que solo son reusables dentro de una aplicación web, pero si lo quieren usar en otras aplicaciones tienen que copiar el código fuente y eso no es reusabilidad, lo correcto es crear su Librería de Controles Web que contengan clases WebControls o CompositeControls.
Lo mismo sucede en MVC, si queremos trabajar con grillas, gráficos, reportes, Microsoft solo ofrece los controles HTML Helpers que son limitados, por lo cual, muchos programadores recurren a librerías de terceros como jQueryUI, KendoUI, Infragistics, DevExpress, etc. También veremos como podemos aumentar controles a los HTML Helpers de MVC.
Les dejo la propaganda a los interesados:
También publico una foto de la tercera charla sobre Reflection y Creación de Controles WinForms.
No se olviden confirmar su asistencia mediante un mail a Luis.duenash@gmail.com e informes@hte.com.pe.
Los dejo con una frase para que reflexionen: "La grandeza de un país se ve por la cantidad de gente culta que en el habita". Si queremos ser un país desarrollado o del primer mundo, necesitamos invertir mas tiempo en nuestra profesión y cultura; no solo hay que ir a trabajar y cumplir con lo que uno puede, sino, hay que hacer el mejor trabajo (como nadie lo haría) y para eso hay que invertir en nuestro conocimiento.
Etiquetas:
.NET,
ASP.NET,
Búsqueda,
C#,
Controles,
Demos,
Entrenamiento,
Filtrar,
GridView,
Grillas,
HTML Helpers,
Lduenas,
Librerías,
MVC,
Ordenar,
Paginar,
Reflection,
Seminarios,
Ubigeo,
WebForms
jueves, 15 de enero de 2015
Entrenamiento - Cuarto y Ultimo Seminario .NET (Creación de Controles en ASP.NET)
Cuarto y Ultimo Seminario .NET: Creación de Controles en ASP.NET (Web Forms y MVC)
Quiero invitar a los interesados al ultimo seminario que tratara sobre "Creación de Controles en ASP.NET", en donde se verá como crear librerías de Controles Web Forms y MVC, habra ejemplos sobre controles Grillas Paginadas, Ordenadas, con Filtros en cabeceras, Exportaciones de Datos, etc.
También crearemos controles de gráficos, de búsqueda y el control ubigeo que por falta de tiempo no se pudo hacer ayer.
Gracias a todos los que asistieron a los seminarios anteriores, sobre a todo los que me vienen acompañando hace muchos años y a los que hicieron el esfuerzo por estar en los 3 seminarios anteriores, con ellos seguiremos trabajando, como lo hacíamos antes.
La idea era compartir con mas personas temas avanzados y temas del futuro en desarrollo de software, tales como "El Internet de las Cosas", "Impresion 3D" y sus implementaciones en "HTML5" y "JavaScripts APIs".
Sobre HTML5 se verían temas como:
- Formularios y Nuevos Controles
- Canvas
- SVG
- Audio y Video
Sobre JavaScripts APIs se verían temas como:
- Web Workers
- Geolocation
- FileStorage (SessionStorage, LocalStorage e IndexedDB)
- Web Audio API
- File System API
- WebGL
- WebSockets
- WebRTC
- Speech API, etc
Pero parece que muchos desean aprender temas actuales para su trabajo, es decir, como Crear Aplicaciones Web, Reportes, Impresiones, etc, temas que se ven en cualquier curso de capacitación. La idea era no repetir con los mismos temas sino prepararnos para el futuro. Pero estamos en un país donde la gente solo ve el día a día y no prevee el mañana.
Particularmente, seguiré trabajando en estos temas y este año lanzare varias librerías y generadores como les había comentado en las charlas. En realidad mi objetivo con el Blog y los Seminarios era no avanzar solo sino que muchas personas se sumaran a esto, pero cada uno establece en su vida prioridades y algunos no toman en serio la necesidad de mejorar cada día ni "entender como funcionan la cosas".
Saludos a todos y que la suerte los acompañe (la van a necesitar)
PD: Los que asistieron al seminario de ayer, hoy les enviare un mail con todos los Demos + Practicas que hice y también estaré publicando en el Blog un ejemplo de un Control Combo con Múltiples Columnas e Imágenes.
Quiero invitar a los interesados al ultimo seminario que tratara sobre "Creación de Controles en ASP.NET", en donde se verá como crear librerías de Controles Web Forms y MVC, habra ejemplos sobre controles Grillas Paginadas, Ordenadas, con Filtros en cabeceras, Exportaciones de Datos, etc.
También crearemos controles de gráficos, de búsqueda y el control ubigeo que por falta de tiempo no se pudo hacer ayer.
Gracias a todos los que asistieron a los seminarios anteriores, sobre a todo los que me vienen acompañando hace muchos años y a los que hicieron el esfuerzo por estar en los 3 seminarios anteriores, con ellos seguiremos trabajando, como lo hacíamos antes.
La idea era compartir con mas personas temas avanzados y temas del futuro en desarrollo de software, tales como "El Internet de las Cosas", "Impresion 3D" y sus implementaciones en "HTML5" y "JavaScripts APIs".
Sobre HTML5 se verían temas como:
- Formularios y Nuevos Controles
- Canvas
- SVG
- Audio y Video
Sobre JavaScripts APIs se verían temas como:
- Web Workers
- Geolocation
- FileStorage (SessionStorage, LocalStorage e IndexedDB)
- Web Audio API
- File System API
- WebGL
- WebSockets
- WebRTC
- Speech API, etc
Pero parece que muchos desean aprender temas actuales para su trabajo, es decir, como Crear Aplicaciones Web, Reportes, Impresiones, etc, temas que se ven en cualquier curso de capacitación. La idea era no repetir con los mismos temas sino prepararnos para el futuro. Pero estamos en un país donde la gente solo ve el día a día y no prevee el mañana.
Particularmente, seguiré trabajando en estos temas y este año lanzare varias librerías y generadores como les había comentado en las charlas. En realidad mi objetivo con el Blog y los Seminarios era no avanzar solo sino que muchas personas se sumaran a esto, pero cada uno establece en su vida prioridades y algunos no toman en serio la necesidad de mejorar cada día ni "entender como funcionan la cosas".
Saludos a todos y que la suerte los acompañe (la van a necesitar)
PD: Los que asistieron al seminario de ayer, hoy les enviare un mail con todos los Demos + Practicas que hice y también estaré publicando en el Blog un ejemplo de un Control Combo con Múltiples Columnas e Imágenes.
Etiquetas:
.NET,
ASP.NET,
Buscar,
Controles,
Demos,
Entrenamiento,
Filtrar,
Graficos,
GridView,
HTE,
Lduenas,
Librerías,
MVC,
Ordenar,
Paginar,
Reflection,
Seminarios,
Ubigeo,
WebForms
jueves, 13 de noviembre de 2014
El Demo del Día: Filtrar en Cabeceras del GridView con Totales en el Pie y Filas de Color
Filtrar en Cabeceras del GridView con Totales en el Pie y Filas de Color
El post que viene es muy interesante ya que es un 3 en 1. Se trata de una GridView en ASP.NET Web Forms que permita filtrar mediante controles en la cabecera, mostrar el número de registros encontrados en el pie y mostrar de color las palabras buscadas en los filtros en los registros encontrados.
Requerimiento
Se necesita crear una consulta web con los siguientes requerimientos:
- La consulta debe ser desconectada y no ir a a cada momento al servidor de datos.
- Los filtros deben ser por todos los campos mostrados y deben ocupar poco espacio.
- Se debe ver de color rojo la palabra buscada en cada columna donde se ingrese un criterio de búsqueda.
- Se debe mostrar la cantidad de registros encontrados en la parte inferior.
Solución
- Usaremos el control GridView y personalizaremos la cabecera, el pie y los registros usando plantilla de datos en Web Forms (Data Template).
- Además usaremos el Enlace de Datos para conservar los valores de los campos buscados en las cabeceras ya que se pierden al ir al servidor web.
- Usaremos funciones de lado del servidor para formatear la cabecera a mostrar asi como los valores de los registros que coincidan con la palabra buscada. En esta última parte usaremos Reflection para obtener el valor de cada propiedad del objeto cabecera.
Nota: Muchos desarrolladores usan controles de terceros para cubrir este requerimiento porque no conocen bien el tema de plantillas de datos, código incrustado del servidor y por supuesto Reflection.
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_FiltroCabecera_RptaColor".
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_FiltroCabecera_RptaColor
{
public class beProducto
{
public beProducto()
{
IdProducto = -1;
IdProveedor = -1;
IdCategoria = -1;
PrecioUnitario = -1;
Stock = -1;
}
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: Se ha creado un constructor para iniciar las propiedades numéricas en -1 y asi poder permitir la búsqueda del cero (0) en los filtros.
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: blue;
color:white;
}
.FilaDatos {
background-color: white;
color:blue;
}
Crear la Pagina ASP .NET como un Formulario Web Form
Agregar un Formulario Web Form al proyecto llamado: "ConsultaProductos.aspx" y escribir lo siguiente:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ConsultaProductos.aspx.cs" Inherits="GridView_FiltroCabecera_RptaColor.ConsultaProductos" %>
<%@ Import Namespace="GridView_FiltroCabecera_RptaColor" %>
<!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>Consulta de Productos</title>
<link href="ACME.css" rel="stylesheet" type="text/css" />
<script>
function filtrar(event) {
var keyCode = ('which' in event) ? event.which : event.keyCode;
if (keyCode == 13) {
var btn = document.getElementById("btnFiltrar");
if (btn != null) btn.click();
return false;
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<table class="AnchoTotal">
<tr class="Titulo">
<td>GridView Filtros Cabecera, Total Pie y Filas Color</td>
</tr>
<tr class="Subtitulo">
<td>Consulta Desconectada de Productos (Autor: Luis Dueñas)</td>
</tr>
<tr>
<td>
<asp:GridView ID="gvProducto" AutoGenerateColumns="false" ShowFooter="true"
Width="700px" ShowHeaderWhenEmpty="true" runat="server">
<HeaderStyle CssClass="FilaCabecera" />
<RowStyle CssClass="FilaDatos" />
<FooterStyle CssClass="FilaCabecera" />
<Columns>
<asp:TemplateField HeaderText="" ItemStyle-Width="80px"
ItemStyle-HorizontalAlign="Right">
<HeaderTemplate>
Código<br />
<asp:TextBox ID="txtIdProducto"
Text="<%#formatearNumero(obeProductoCab.IdProducto)%>"
onkeypress="return filtrar(event);" Width="80px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
IdProducto.ToString(),"IdProducto")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="300px"
FooterStyle-HorizontalAlign="Right">
<HeaderTemplate>
Descripción del Producto<br />
<asp:TextBox ID="txtNombre" Text="<%#obeProductoCab.Nombre%>"
onkeypress="return filtrar(event);" Width="300px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
Nombre,"Nombre")%>
</ItemTemplate>
<FooterTemplate>
<b>Total de Registros encontrados: </b>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="80px" ItemStyle-HorizontalAlign="Right"
FooterStyle-HorizontalAlign="Right">
<HeaderTemplate>
Id Prov<br />
<asp:TextBox ID="txtIdProveedor"
Text="<%#formatearNumero(obeProductoCab.IdProveedor)%>"
onkeypress="return filtrar(event);" Width="80px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
IdProveedor.ToString(),"IdProveedor")%>
</ItemTemplate>
<FooterTemplate>
<b><%#lbeFiltro.Count%></b>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="80px" ItemStyle-HorizontalAlign="Right">
<HeaderTemplate>
Id Cat<br />
<asp:TextBox ID="txtIdCategoria"
Text="<%#formatearNumero(obeProductoCab.IdCategoria)%>"
onkeypress="return filtrar(event);" Width="80px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
IdCategoria.ToString(),"IdCategoria")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="80px"
ItemStyle-HorizontalAlign="Right">
<HeaderTemplate>
Pre Unit<br />
<asp:TextBox ID="txtPrecioUnitario"
Text="<%#formatearNumero(obeProductoCab.PrecioUnitario)%>"
onkeypress="return filtrar(event);" Width="80px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
PrecioUnitario.ToString(),"PrecioUnitario")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="80px" ItemStyle-HorizontalAlign="Right">
<HeaderTemplate>
Stock<br />
<asp:TextBox ID="txtStock"
Text="<%#formatearNumero(obeProductoCab.Stock)%>"
onkeypress="return filtrar(event);" Width="80px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
Stock.ToString(),"Stock")%>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</td>
</tr>
</table>
<asp:Button ID="btnFiltrar" OnClick="filtrarProductos" runat="server" />
</div>
</form>
</body>
</html>
Nota: El script del cliente "filtrar" se llama al dar Enter a cualquier control de la cabecera y ejecuta el clic del botón "btnFiltrar:" que es el que permite realizar el filtro y esta oculto por código.
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.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace GridView_FiltroCabecera_RptaColor
{
public partial class ConsultaProductos : System.Web.UI.Page
{
private List<beProducto> lbeProducto;
protected List<beProducto> lbeFiltro;
protected beProducto obeProductoCab;
protected void Page_Load(object sender, EventArgs e)
{
btnFiltrar.Attributes.Add("style", "display:none");
obeProductoCab = new beProducto();
if (!Page.IsPostBack)
{
brProducto obrProducto = new brProducto();
lbeProducto = obrProducto.listar();
lbeFiltro = lbeProducto;
Session["Productos"] = lbeProducto;
gvProducto.DataSource = lbeFiltro;
gvProducto.DataBind();
}
}
protected string formatearNumero(dynamic campo)
{
string cabecera = "";
if (campo > -1) cabecera = campo.ToString();
return (cabecera);
}
private bool buscarProductos(beProducto obeProducto)
{
bool exitoIdProducto = true;
bool exitoNombre = true;
bool exitoIdProveedor = true;
bool exitoIdCategoria = true;
bool exitoPrecioUnitario = true;
bool exitoStock = true;
if (obeProductoCab.IdProducto>-1) exitoIdProducto = (obeProducto.IdProducto.ToString().Contains(obeProductoCab.IdProducto.ToString()));
if (!obeProductoCab.Nombre.Equals("")) exitoNombre = (obeProducto.Nombre.ToLower().Contains(obeProductoCab.Nombre.ToLower()));
if (obeProductoCab.IdProveedor > -1) exitoIdProveedor = (obeProducto.IdProveedor.ToString().Contains(obeProductoCab.IdProveedor.ToString()));
if (obeProductoCab.IdCategoria > -1) exitoIdCategoria = (obeProducto.IdCategoria.ToString().Contains(obeProductoCab.IdCategoria.ToString()));
if (obeProductoCab.PrecioUnitario > -1) exitoPrecioUnitario = (obeProducto.PrecioUnitario.ToString().Contains(obeProductoCab.PrecioUnitario.ToString()));
if (obeProductoCab.Stock > -1) exitoStock = (obeProducto.Stock.ToString().Contains(obeProductoCab.Stock.ToString()));
return (exitoIdProducto && exitoNombre && exitoIdProveedor && exitoIdCategoria && exitoPrecioUnitario && exitoStock);
}
protected void filtrarProductos(object sender, EventArgs e)
{
guardarFiltros();
lbeProducto=(List<beProducto>)Session["Productos"];
Predicate<beProducto> pred = new Predicate<beProducto>(buscarProductos);
lbeFiltro = lbeProducto.FindAll(pred);
gvProducto.DataSource = lbeFiltro;
gvProducto.DataBind();
}
private void guardarFiltros()
{
string sIdProducto = ((TextBox)gvProducto.HeaderRow.Cells[0].Controls[1]).Text;
obeProductoCab.IdProducto = (sIdProducto.Equals("") ? -1 : int.Parse(sIdProducto));
obeProductoCab.Nombre = ((TextBox)gvProducto.HeaderRow.Cells[1].Controls[1]).Text;
string sIdProveedor = ((TextBox)gvProducto.HeaderRow.Cells[2].Controls[1]).Text;
obeProductoCab.IdProveedor = (sIdProveedor.Equals("") ? -1 : int.Parse(sIdProveedor));
string sIdCategoria = ((TextBox)gvProducto.HeaderRow.Cells[3].Controls[1]).Text;
obeProductoCab.IdCategoria = (sIdCategoria.Equals("") ? -1 : int.Parse(sIdCategoria));
string sPrecioUnitario = ((TextBox)gvProducto.HeaderRow.Cells[4].Controls[1]).Text;
obeProductoCab.PrecioUnitario = (sPrecioUnitario.Equals("") ? -1 : decimal.Parse(sPrecioUnitario));
string sStock = ((TextBox)gvProducto.HeaderRow.Cells[5].Controls[1]).Text;
obeProductoCab.Stock = (sStock.Equals("") ? short.Parse("-1") : short.Parse(sStock));
}
protected string formatearCelda(string valor,string campo)
{
StringBuilder rpta = new StringBuilder();
string celda = valor.ToLower();
dynamic cabecera = obeProductoCab.GetType().GetProperty(campo).
GetValue(obeProductoCab, null);
if (cabecera != null)
{
if (!(cabecera is string) && (cabecera == -1)) return valor;
if ((cabecera is string) && cabecera.Equals("")) return valor;
string busca = cabecera.ToString().ToLower();
int posInicio =0;
int pos = celda.IndexOf(busca);
if (pos > -1)
{
while (true)
{
pos = celda.IndexOf(busca, pos);
if (pos > -1)
{
rpta.Append(valor.Substring(posInicio,pos-posInicio));
rpta.Append("<span style='color:red;font-bold:true'>");
rpta.Append(valor.Substring(pos, busca.Length));
rpta.Append("</span>");
posInicio = pos + busca.Length;
pos += 1;
}
else break;
}
rpta.Append(valor.Substring(posInicio, valor.Length - posInicio));
}
else rpta.Append(valor);
}
else rpta.Append(valor);
return (rpta.ToString());
}
}
}
Nota: El código mas complejo se encuentra en la función "formatearCelda" que se llama desde cada campo de cada registro mostrado en el filtro y que pasa como parámetro el valor de la celda a presentar y el campo a buscar para la cabecera. Aquí usamos Reflection para obtener el valor de cada propiedad del objeto cabecera e iniciar la búsqueda de la palabra en el valor e ir agregando en un StringBuilder la cadena con formato (negrita y colo rojo).
También es necesario antes de "filtrarProductos" llamar a la función "guardarFiltros" que se encarga de pasar los valores de los controles de la cabecera de la grilla en el objeto enlazado a la cabecera llamado: "obeProductoCab", de lo contrario se perderían los valores ingresados.
Finalmente, hay que aclarar que para poder usar desde el código HTML (aspx) un objeto o variables es necesario definirla como protected (por herencia), este es el caso de "lbeFiltro" y "obeProductoCab".
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 "ConsultaProductos.aspx" y seleccionar "Ver en el explorador". Se mostrará una ventana similar a la siguiente figura:
Se listarán todos los productos de Northwind, ahora escribir sobre el control TextBox de la cabecera del nombre la palabra "ma" y pulsar "Enter" y se filtrarán los registros apareciendo la palabra "ma" de color rojo y en negrita, tal como se muestra a continuación:
Sobre este filtro aumentar un filtro más ingresando sobre la cabecera del código del producto el número "1" y se filtrará por los 2 criterios apareciendo el número "1" de color rojo y en negrita igual que la palabra "ma", tal como se muestra en la figura de abajo:
Aumentar otro filtro para el Id de la Categoría escribiendo el número "4" y se filtrará por 3 criterios, reduciéndose mas el resultado y apareciendo de color rojo y en negrita el número "4" de la categoría, tal como se ve en la figura:
Finalmente, probemos un filtro mas que no muestre ningún registro, para lo cual aumentar como cuarto filtro que el Stock tenga el número "5", lo cual no genera ningún resultado, pero la cabecera se mantiene gracias a la propiedad: ShowHeaderWhenEmpty="true".
Si deseas mostrar todos los registros borrar cada campo de la cabecera y dar Enter en cualquiera.
Comentario Final
En este post, vimos como se puede crear en un GridView cabeceras y pies personalizados, en este caso para filtrar en forma desconectada usando plantillas de datos y código incrustado del servidor, también vimos como resaltar la palabra buscada en cada columna, aunque se aprecia mejor en columnas de tipo cadena que numérico.
Espero les guste el Demo y recuerden que No es tan complicado crear su propio control Grilla Personalizada, aunque muchos No les gusta hacerse problemas y usan sus controles jGrid, trueGrid, softGrid, superGrid, etc, pero lo mejor seria el yourSelfGrid (Grid de ti mismo).
Nota: En mis cursos creo en la cabecera DropDownList (Combos) para filtrar por Proveedor y Categoría, pero no pinto de colores los registros encontrados.
PD: Los que llevan el curso de MVC los Sábados ya tienen una ayudita para terminar lo que les deje.
Descarga:
GridView_FiltroCabecera_RptaColor
El post que viene es muy interesante ya que es un 3 en 1. Se trata de una GridView en ASP.NET Web Forms que permita filtrar mediante controles en la cabecera, mostrar el número de registros encontrados en el pie y mostrar de color las palabras buscadas en los filtros en los registros encontrados.
Requerimiento
Se necesita crear una consulta web con los siguientes requerimientos:
- La consulta debe ser desconectada y no ir a a cada momento al servidor de datos.
- Los filtros deben ser por todos los campos mostrados y deben ocupar poco espacio.
- Se debe ver de color rojo la palabra buscada en cada columna donde se ingrese un criterio de búsqueda.
- Se debe mostrar la cantidad de registros encontrados en la parte inferior.
Solución
- Usaremos el control GridView y personalizaremos la cabecera, el pie y los registros usando plantilla de datos en Web Forms (Data Template).
- Además usaremos el Enlace de Datos para conservar los valores de los campos buscados en las cabeceras ya que se pierden al ir al servidor web.
- Usaremos funciones de lado del servidor para formatear la cabecera a mostrar asi como los valores de los registros que coincidan con la palabra buscada. En esta última parte usaremos Reflection para obtener el valor de cada propiedad del objeto cabecera.
Nota: Muchos desarrolladores usan controles de terceros para cubrir este requerimiento porque no conocen bien el tema de plantillas de datos, código incrustado del servidor y por supuesto Reflection.
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_FiltroCabecera_RptaColor".
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_FiltroCabecera_RptaColor
{
public class beProducto
{
public beProducto()
{
IdProducto = -1;
IdProveedor = -1;
IdCategoria = -1;
PrecioUnitario = -1;
Stock = -1;
}
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: Se ha creado un constructor para iniciar las propiedades numéricas en -1 y asi poder permitir la búsqueda del cero (0) en los filtros.
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: blue;
color:white;
}
.FilaDatos {
background-color: white;
color:blue;
}
Crear la Pagina ASP .NET como un Formulario Web Form
Agregar un Formulario Web Form al proyecto llamado: "ConsultaProductos.aspx" y escribir lo siguiente:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ConsultaProductos.aspx.cs" Inherits="GridView_FiltroCabecera_RptaColor.ConsultaProductos" %>
<%@ Import Namespace="GridView_FiltroCabecera_RptaColor" %>
<!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>Consulta de Productos</title>
<link href="ACME.css" rel="stylesheet" type="text/css" />
<script>
function filtrar(event) {
var keyCode = ('which' in event) ? event.which : event.keyCode;
if (keyCode == 13) {
var btn = document.getElementById("btnFiltrar");
if (btn != null) btn.click();
return false;
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<table class="AnchoTotal">
<tr class="Titulo">
<td>GridView Filtros Cabecera, Total Pie y Filas Color</td>
</tr>
<tr class="Subtitulo">
<td>Consulta Desconectada de Productos (Autor: Luis Dueñas)</td>
</tr>
<tr>
<td>
<asp:GridView ID="gvProducto" AutoGenerateColumns="false" ShowFooter="true"
Width="700px" ShowHeaderWhenEmpty="true" runat="server">
<HeaderStyle CssClass="FilaCabecera" />
<RowStyle CssClass="FilaDatos" />
<FooterStyle CssClass="FilaCabecera" />
<Columns>
<asp:TemplateField HeaderText="" ItemStyle-Width="80px"
ItemStyle-HorizontalAlign="Right">
<HeaderTemplate>
Código<br />
<asp:TextBox ID="txtIdProducto"
Text="<%#formatearNumero(obeProductoCab.IdProducto)%>"
onkeypress="return filtrar(event);" Width="80px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
IdProducto.ToString(),"IdProducto")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="300px"
FooterStyle-HorizontalAlign="Right">
<HeaderTemplate>
Descripción del Producto<br />
<asp:TextBox ID="txtNombre" Text="<%#obeProductoCab.Nombre%>"
onkeypress="return filtrar(event);" Width="300px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
Nombre,"Nombre")%>
</ItemTemplate>
<FooterTemplate>
<b>Total de Registros encontrados: </b>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="80px" ItemStyle-HorizontalAlign="Right"
FooterStyle-HorizontalAlign="Right">
<HeaderTemplate>
Id Prov<br />
<asp:TextBox ID="txtIdProveedor"
Text="<%#formatearNumero(obeProductoCab.IdProveedor)%>"
onkeypress="return filtrar(event);" Width="80px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
IdProveedor.ToString(),"IdProveedor")%>
</ItemTemplate>
<FooterTemplate>
<b><%#lbeFiltro.Count%></b>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="80px" ItemStyle-HorizontalAlign="Right">
<HeaderTemplate>
Id Cat<br />
<asp:TextBox ID="txtIdCategoria"
Text="<%#formatearNumero(obeProductoCab.IdCategoria)%>"
onkeypress="return filtrar(event);" Width="80px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
IdCategoria.ToString(),"IdCategoria")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="80px"
ItemStyle-HorizontalAlign="Right">
<HeaderTemplate>
Pre Unit<br />
<asp:TextBox ID="txtPrecioUnitario"
Text="<%#formatearNumero(obeProductoCab.PrecioUnitario)%>"
onkeypress="return filtrar(event);" Width="80px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
PrecioUnitario.ToString(),"PrecioUnitario")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ItemStyle-Width="80px" ItemStyle-HorizontalAlign="Right">
<HeaderTemplate>
Stock<br />
<asp:TextBox ID="txtStock"
Text="<%#formatearNumero(obeProductoCab.Stock)%>"
onkeypress="return filtrar(event);" Width="80px" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<%#formatearCelda(((beProducto)Container.DataItem).
Stock.ToString(),"Stock")%>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</td>
</tr>
</table>
<asp:Button ID="btnFiltrar" OnClick="filtrarProductos" runat="server" />
</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.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace GridView_FiltroCabecera_RptaColor
{
public partial class ConsultaProductos : System.Web.UI.Page
{
private List<beProducto> lbeProducto;
protected List<beProducto> lbeFiltro;
protected beProducto obeProductoCab;
protected void Page_Load(object sender, EventArgs e)
{
btnFiltrar.Attributes.Add("style", "display:none");
obeProductoCab = new beProducto();
if (!Page.IsPostBack)
{
brProducto obrProducto = new brProducto();
lbeProducto = obrProducto.listar();
lbeFiltro = lbeProducto;
Session["Productos"] = lbeProducto;
gvProducto.DataSource = lbeFiltro;
gvProducto.DataBind();
}
}
protected string formatearNumero(dynamic campo)
{
string cabecera = "";
if (campo > -1) cabecera = campo.ToString();
return (cabecera);
}
private bool buscarProductos(beProducto obeProducto)
{
bool exitoIdProducto = true;
bool exitoNombre = true;
bool exitoIdProveedor = true;
bool exitoIdCategoria = true;
bool exitoPrecioUnitario = true;
bool exitoStock = true;
if (obeProductoCab.IdProducto>-1) exitoIdProducto = (obeProducto.IdProducto.ToString().Contains(obeProductoCab.IdProducto.ToString()));
if (!obeProductoCab.Nombre.Equals("")) exitoNombre = (obeProducto.Nombre.ToLower().Contains(obeProductoCab.Nombre.ToLower()));
if (obeProductoCab.IdProveedor > -1) exitoIdProveedor = (obeProducto.IdProveedor.ToString().Contains(obeProductoCab.IdProveedor.ToString()));
if (obeProductoCab.IdCategoria > -1) exitoIdCategoria = (obeProducto.IdCategoria.ToString().Contains(obeProductoCab.IdCategoria.ToString()));
if (obeProductoCab.PrecioUnitario > -1) exitoPrecioUnitario = (obeProducto.PrecioUnitario.ToString().Contains(obeProductoCab.PrecioUnitario.ToString()));
if (obeProductoCab.Stock > -1) exitoStock = (obeProducto.Stock.ToString().Contains(obeProductoCab.Stock.ToString()));
return (exitoIdProducto && exitoNombre && exitoIdProveedor && exitoIdCategoria && exitoPrecioUnitario && exitoStock);
}
protected void filtrarProductos(object sender, EventArgs e)
{
guardarFiltros();
lbeProducto=(List<beProducto>)Session["Productos"];
Predicate<beProducto> pred = new Predicate<beProducto>(buscarProductos);
lbeFiltro = lbeProducto.FindAll(pred);
gvProducto.DataSource = lbeFiltro;
gvProducto.DataBind();
}
private void guardarFiltros()
{
string sIdProducto = ((TextBox)gvProducto.HeaderRow.Cells[0].Controls[1]).Text;
obeProductoCab.IdProducto = (sIdProducto.Equals("") ? -1 : int.Parse(sIdProducto));
obeProductoCab.Nombre = ((TextBox)gvProducto.HeaderRow.Cells[1].Controls[1]).Text;
string sIdProveedor = ((TextBox)gvProducto.HeaderRow.Cells[2].Controls[1]).Text;
obeProductoCab.IdProveedor = (sIdProveedor.Equals("") ? -1 : int.Parse(sIdProveedor));
string sIdCategoria = ((TextBox)gvProducto.HeaderRow.Cells[3].Controls[1]).Text;
obeProductoCab.IdCategoria = (sIdCategoria.Equals("") ? -1 : int.Parse(sIdCategoria));
string sPrecioUnitario = ((TextBox)gvProducto.HeaderRow.Cells[4].Controls[1]).Text;
obeProductoCab.PrecioUnitario = (sPrecioUnitario.Equals("") ? -1 : decimal.Parse(sPrecioUnitario));
string sStock = ((TextBox)gvProducto.HeaderRow.Cells[5].Controls[1]).Text;
obeProductoCab.Stock = (sStock.Equals("") ? short.Parse("-1") : short.Parse(sStock));
}
protected string formatearCelda(string valor,string campo)
{
StringBuilder rpta = new StringBuilder();
string celda = valor.ToLower();
dynamic cabecera = obeProductoCab.GetType().GetProperty(campo).
GetValue(obeProductoCab, null);
if (cabecera != null)
{
if (!(cabecera is string) && (cabecera == -1)) return valor;
if ((cabecera is string) && cabecera.Equals("")) return valor;
string busca = cabecera.ToString().ToLower();
int posInicio =0;
int pos = celda.IndexOf(busca);
if (pos > -1)
{
while (true)
{
pos = celda.IndexOf(busca, pos);
if (pos > -1)
{
rpta.Append(valor.Substring(posInicio,pos-posInicio));
rpta.Append("<span style='color:red;font-bold:true'>");
rpta.Append(valor.Substring(pos, busca.Length));
rpta.Append("</span>");
posInicio = pos + busca.Length;
pos += 1;
}
else break;
}
rpta.Append(valor.Substring(posInicio, valor.Length - posInicio));
}
else rpta.Append(valor);
}
else rpta.Append(valor);
return (rpta.ToString());
}
}
}
Nota: El código mas complejo se encuentra en la función "formatearCelda" que se llama desde cada campo de cada registro mostrado en el filtro y que pasa como parámetro el valor de la celda a presentar y el campo a buscar para la cabecera. Aquí usamos Reflection para obtener el valor de cada propiedad del objeto cabecera e iniciar la búsqueda de la palabra en el valor e ir agregando en un StringBuilder la cadena con formato (negrita y colo rojo).
También es necesario antes de "filtrarProductos" llamar a la función "guardarFiltros" que se encarga de pasar los valores de los controles de la cabecera de la grilla en el objeto enlazado a la cabecera llamado: "obeProductoCab", de lo contrario se perderían los valores ingresados.
Finalmente, hay que aclarar que para poder usar desde el código HTML (aspx) un objeto o variables es necesario definirla como protected (por herencia), este es el caso de "lbeFiltro" y "obeProductoCab".
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 "ConsultaProductos.aspx" y seleccionar "Ver en el explorador". Se mostrará una ventana similar a la siguiente figura:
Se listarán todos los productos de Northwind, ahora escribir sobre el control TextBox de la cabecera del nombre la palabra "ma" y pulsar "Enter" y se filtrarán los registros apareciendo la palabra "ma" de color rojo y en negrita, tal como se muestra a continuación:
Sobre este filtro aumentar un filtro más ingresando sobre la cabecera del código del producto el número "1" y se filtrará por los 2 criterios apareciendo el número "1" de color rojo y en negrita igual que la palabra "ma", tal como se muestra en la figura de abajo:
Aumentar otro filtro para el Id de la Categoría escribiendo el número "4" y se filtrará por 3 criterios, reduciéndose mas el resultado y apareciendo de color rojo y en negrita el número "4" de la categoría, tal como se ve en la figura:
Finalmente, probemos un filtro mas que no muestre ningún registro, para lo cual aumentar como cuarto filtro que el Stock tenga el número "5", lo cual no genera ningún resultado, pero la cabecera se mantiene gracias a la propiedad: ShowHeaderWhenEmpty="true".
Si deseas mostrar todos los registros borrar cada campo de la cabecera y dar Enter en cualquiera.
Comentario Final
En este post, vimos como se puede crear en un GridView cabeceras y pies personalizados, en este caso para filtrar en forma desconectada usando plantillas de datos y código incrustado del servidor, también vimos como resaltar la palabra buscada en cada columna, aunque se aprecia mejor en columnas de tipo cadena que numérico.
Espero les guste el Demo y recuerden que No es tan complicado crear su propio control Grilla Personalizada, aunque muchos No les gusta hacerse problemas y usan sus controles jGrid, trueGrid, softGrid, superGrid, etc, pero lo mejor seria el yourSelfGrid (Grid de ti mismo).
Nota: En mis cursos creo en la cabecera DropDownList (Combos) para filtrar por Proveedor y Categoría, pero no pinto de colores los registros encontrados.
PD: Los que llevan el curso de MVC los Sábados ya tienen una ayudita para terminar lo que les deje.
Descarga:
GridView_FiltroCabecera_RptaColor
Etiquetas:
C#,
Data Templates,
Demos,
Filas de Color,
Filtros en Cabecera,
FooterTemplate,
GridView,
HeaderRow,
HeaderTemplate,
ItemTemplate,
Javascript,
Lduenas,
ShowHeaderWhenEmpty,
StringBuilder,
Total en Pie,
WebForms
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
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 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>
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
Etiquetas:
.NET,
ADO.NET,
AllowPaging,
ASP.NET,
C#,
CheckBox,
CSS,
Data Binding,
Data Templates,
Demos,
GridView,
Lduenas,
Listas Objetos,
NewPageIndex,
Paginar,
Session,
StringBuilder,
Templates,
Web Forms
Suscribirse a:
Entradas (Atom)

















