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

miércoles, 22 de noviembre de 2017

El Manual del Día: Windows Forms 3.5

MSDN - Manual de Windows Forms

Titulo: Manual de Windows Forms 3.5
Fuente Original: Microsoft Developer Network (MSDN)
Compilado Por: Luis Dueñas Huaroto (Lduenas)
Año de Compilación: 2008
Número de Páginas: 324

Indice del Manual de Windows Forms

1. Lo Nuevo en Formularios Windows Forms para .NET Framework 3.5
2. Adiciones a Formularios Windows Forms para .NET Framework 2.0
  2.1. Nuevas Adiciones a las Características Existentes en los Formularios Windows Forms
3. Introducción a los Formularios Windows Forms
  3.1. Información General sobre Formularios Windows Forms
  3.2. Crear un Nuevo Formulario Windows Forms
    3.2.1. Coordenadas de Formularios Windows Forms
    3.2.2. Tutorial: Crear un Formulario Windows Forms Sencillo
    3.2.3. Tutorial: Introducción al Diseñador de Windows Forms
    3.2.4. Cómo: Crear una Aplicación de Windows Forms desde la Línea de Comandos
    3.2.5. Cómo: Crear un proyecto de aplicación para Windows
    3.2.6. Cómo: Agregar Formularios Windows Forms a un Proyecto
    3.2.7. Cómo: Elegir el Formulario de Inicio en una Aplicación para Windows
    3.2.8. Cómo: Mostrar Formularios Windows Forms en el Diseñador
    3.2.9. Cómo: Mantener un Formulario Windows Forms en Primer Plano
    3.2.10. Cómo: Compilar y Ejecutar un Ejemplo de Código Completo de Formularios Windows Forms utilizando Visual Studio
  3.3. Crear Controladores de Eventos en Formularios Windows Forms
    3.3.1. Información General sobre Eventos
    3.3.2. Información General sobre Controladores de Eventos
    3.3.3. Cómo: Crear Controladores de Eventos en Tiempo de Ejecución
    3.3.4. Cómo: Conectar Varios Eventos con un Unico Controlador de Eventos
    3.3.5. Orden de Eventos en los Formularios Windows Forms
    3.3.6. Cómo: Crear Controladores de Eventos con el Diseñador
    3.3.7. Cómo: Crear Controladores de Eventos Predeterminados en el Diseñador
  3.4. Ajustar el Tamaño y la Escala de Formularios Windows Forms
    3.4.1. Cómo: Cambiar el Tamaño de Formularios Windows Forms con el Diseñador
    3.4.2. Cómo: Cambiar el Tamaño de los Formularios Windows Forms
    3.4.3. Tutorial: Crear un Formulario Windows Forms de Entrada de Datos de Tamaño Variable
    3.4.4. Ajuste Automático de Escala en Formularios Windows Forms
    3.4.4.1. Cómo: Responder a los Cambios de las Combinaciones de Fuentes en una Aplicación de Windows Forms
  3.5. Cambiar la Apariencia de Formularios Windows Forms
    3.5.1. Cómo: Cambiar los Bordes de Formularios Windows Forms
    3.5.2. Cómo: Agregar Imágenes de Fondo a Formularios Windows Forms
    3.5.3. Cómo: Cambiar los Bordes de Formularios Windows Forms mediante el Diseñador
    3.5.4. Cómo: Crear Formularios Windows Forms Transparentes
    3.5.5. Cómo: Crear Formularios Windows Forms No Rectangulares
    3.5.6. Cómo: Mostrar Formularios Windows Forms Modales y No Modales
    3.5.7. Cómo: Habilitar Estilos Visuales en Windows XP
    3.5.8. Cómo: Hacer Invisible un Formulario Windows Forms de Inicio
    3.5.9. Cómo: Establecer la Ubicación en Pantalla de Formularios Windows Forms
  3.6. Controles de Formularios Windows Forms
    3.6.1. Insertar Controles en Formularios Windows Forms
      3.6.1.1. Cómo: Agregar Controles a Formularios Windows Forms
      3.6.1.2. Cómo: Agregar Controles sin una Interfaz de Usuario a Formularios
      3.6.1.3. Cómo: Agregar o Quitar Controles de una Colección en Tiempo de Ejecución
      3.6.1.4. Tutorial: Rellenar Automáticamente el Cuadro de Herramientas con Componentes Personalizados
      3.6.1.5. Cómo: Agregar Controles ActiveX a Formularios Windows Forms
      3.6.1.6. Consideraciones al Alojar un Control ActiveX en un Formulario
    3.6.2. Organizar Controles en Formularios Windows Forms
      3.6.2.1. Cómo: Alinear Varios Controles en Formularios Windows Forms
      3.6.2.2. Cómo: Delimitar Controles en Formularios Windows Forms
      3.6.2.3. Cómo: Copiar Controles Entre Formularios Windows Forms
      3.6.2.4. Cómo: Acoplar Controles en Formularios Windows Forms
      3.6.2.5. Cómo: Disponer Objetos en Capas en Formularios Windows Forms
      3.6.2.6. Cómo: Bloquear Controles en Formularios Windows Forms
      3.6.2.7. Cómo: Colocar los Controles en Formularios Windows Forms
      3.6.2.8. Cómo: Cambiar el Tamaño de los Controles en Formularios Windows
      3.6.2.9. Cómo: Establecer Opciones de Cuadrícula para Todos los Formularios Windows Forms
      3.6.2.10. Cómo: Establecer el Orden de Tabulación en Formularios Windows
      3.6.2.11. Tutorial: Organizar Controles en Formularios Windows Forms Mediante Líneas de Ajuste
      3.6.2.12. Cómo: Organizar Controles con las Líneas de Ajuste y la Cuadrícula en Formularios Windows Forms
      3.6.2.13. Cómo: Reasignar Controles Existentes en un Elemento Primario Diferente
      3.6.2.14. Tutorial: Diseñar Controles de Formularios Windows Forms con Relleno, Márgenes y la Propiedad AutoSize
    3.6.3. Asignar Etiquetas a Controles Individuales de Formularios Windows Forms y Proporcionar Accesos Directos a los Mismos
      3.6.3.1. Cómo: Establecer el Texto Mostrado por un Control de Formulario
      3.6.3.2. Cómo: Establecer el Texto Mostrado por un Control de Formularios Windows Forms mediante el Diseñador
      3.6.3.3. Cómo: Establecer la Imagen que Muestra un Control de Formulario
      3.6.3.4. Cómo: Establecer la Imagen Mostrada por un Control de Formularios Windows Forms mediante el Diseñador
      3.6.3.5. Cómo: Crear Teclas de Acceso para Controles de Windows Forms
      3.6.3.6. Cómo: Crear Teclas de Acceso para Controles de Formularios Windows Forms mediante el Diseñador
      3.6.3.7. Proporcionar Información de Accesibilidad de Controles en un Formulario Windows Forms
    3.6.4. Controles que se Utilizan en Formularios Windows Forms
      3.6.4.1. Controles de Formularios Windows Forms por Función
      3.6.4.2. Controles Compatibles con Dibujos Propietarios Integrados
      3.6.4.3. Controles de Formularios Windows Forms Usados para Mostrar Opciones
        3.6.4.3.1. Cuándo Utilizar un control ComboBox de Formularios Windows Forms en lugar de un Control ListBox
        3.6.4.3.2. Cómo: Obtener Acceso a Elementos Específicos de un Control ComboBox, CheckedListBox o ListBox
        3.6.4.3.3. Cómo: Agregar y Quitar Elementos de un Control ComboBox, CheckedListBox o ListBox
        3.6.4.3.4. Cómo: Crear una Tabla de Búsqueda para un Control ComboBox, ListBox o CheckedListBox
        3.6.4.3.5. Cómo: Enlazar un Control ComboBox o ListBox de Formularios Windows Forms a Datos
        3.6.4.3.6. Cómo: Ordenar el Contenido de un Control ComboBox, CheckedListBox o ListBox
    3.6.5. Desarrollar Controles Personalizados de Formularios Windows Forms con .NET Framework
      3.6.5.1. Información General sobre cómo Utilizar Controles en los Formularios
      3.6.5.2. Variedades de Controles Personalizados
        3.6.5.2.1. Recomendaciones sobre Tipos de Controles
      3.6.5.3. Fundamentos de Desarrollo de Controles de Formularios Windows
      3.6.5.4. Propiedades de los Controles de Formularios Windows Forms
        3.6.5.4.1. Definir una Propiedad en los Controles
        3.6.5.4.2. Definir Valores Predeterminados con los Métodos ShouldSerialize y Reset
        3.6.5.4.3. Eventos de Cambio de Propiedades
        3.6.5.4.4. Cómo: Exponer Propiedades de Controles Constituyentes
        3.6.5.4.5. Implementación de Métodos en Controles Personalizados
      3.6.5.5. Eventos de los Controles de Formularios Windows Forms
        3.6.5.5.1. Reemplazar el Método OnPaint
        3.6.5.5.2. Controlar la Introducción de Datos por el Usuario
        3.6.5.5.3. Definir un Evento en los Controles de Formularios Windows
      3.6.5.6. Atributos en Controles de Formularios Windows Forms
      3.6.5.7. Dibujo y Representación Personalizados de Controles
        3.6.5.7.1. Representar un Control de Formularios Windows Forms
        3.6.5.7.2. Controles Dibujados por el Usuario
        3.6.5.7.3. Controles Constituyentes
        3.6.5.7.4. Cómo: Hacer un Control No Visible en Tiempo de Ejecución
        3.6.5.7.5. Cómo: Proporcionar un Fondo Transparente a un Control
        3.6.5.7.6. Representar Controles con Estilos Visuales
          3.6.5.7.6.1. Cómo: Utilizar una Clase de Representación de Controles
          3.6.5.7.6.2. Cómo: Representar un Elemento de Estilo Visual
      3.6.5.8. Diseño de los Controles de Formularios Windows Forms
        3.6.5.8.1. Información General sobre la Propiedad AutoSize
        3.6.5.8.2. Cómo: Alinear un Control con los Bordes de los Formularios
        3.6.5.8.3. Márgenes y Relleno en Controles de Formularios Windows
        3.6.5.8.4. Cómo: Crear un Borde Alrededor de un Control con Relleno
        3.6.5.8.5. Cómo: Implementar un Motor de Diseño Personalizado
      3.6.5.9. Subprocesamiento Múltiple en los Controles de Formularios Windows
        3.6.5.9.1. Cómo: Realizar Llamadas Seguras para Subprocesos en Controles de Formularios Windows Forms
        3.6.5.9.2. Cómo: Utilizar un Subproceso en Segundo Plano para Buscar Archivos
    3.6.6. Desarrollar Controles de Formularios Windows Forms en Tiempo de Diseño
      3.6.6.1. Tutorial: Crear un Control Compuesto con Visual Basic
      3.6.6.2. Tutorial: Heredar de un Control de Formularios Windows Forms con Visual Basic
      3.6.6.3. Tutorial: Realizar Tareas Comunes utilizando Etiquetas Inteligentes
      3.6.6.4. Tutorial: Serializar Colecciones de Tipos Estándar con DesignerSerializationVisibilityAttribute
      3.6.6.5. Tutorial: Depurar Controles Personalizados en Tiempo de Diseño
      3.6.6.6. Cómo: Crear Controles de Formularios Windows Forms
      3.6.6.7. Cómo: Crear Controles Compuestos
      3.6.6.8. Cómo: Heredar de una Clase UserControl
      3.6.6.9. Cómo: Heredar de Controles de Formularios Existentes
      3.6.6.10. Cómo: Heredar de una Clase de Control
      3.6.6.11. Cómo: Alinear un Control con los Bordes de los Formularios en Tiempo de Diseño
      3.6.6.12. Cómo: Mostrar un Control en el Cuadro de Diálogo Personalizar Cuadro de Herramientas
      3.6.6.13. Cómo: Proporcionar un Mapa de Bits del Cuadro de Herramientas para un Control
      3.6.6.14. Cómo: Comprobar el Comportamiento de un Control de Usuario en Tiempo de Ejecución
      3.6.6.15. Errores en Tiempo de Diseño en el Diseñador de Windows Forms
      3.6.6.16. Solución de Problemas Relacionados con la Creación de Controles y Componentes
  3.7. Datos Proporcionados por el Usuario en Formularios Windows Forms
    3.7.1. Datos Introducidos por el Usuario en una Aplicación de Formularios
    3.7.2. Entradas mediante Teclado en una Aplicación de Windows Forms
      3.7.2.1. Funcionamiento de las Entradas mediante Teclado
      3.7.2.2. Utilizar Eventos de Teclado
      3.7.2.3. Cómo: Modificar las Entradas mediante Teclado en un Control Estándar
      3.7.2.4. Cómo: Determinar qué Tecla Modificadora se Presionó
      3.7.2.5. Cómo: Controlar los Datos Introducidos mediante el Teclado en el Formulario
    3.7.3. Entradas Mediante el Mouse en una Aplicación de Windows Forms
      3.7.3.1. Funcionamiento de la Entrada del Mouse en los Formularios Windows
      3.7.3.2. Eventos del Mouse en Formularios Windows Forms
      3.7.3.3. Cómo: Distinguir Operaciones de Clic y Doble Clic
      3.7.3.4. Punteros del Mouse en Formularios Windows Forms
      3.7.3.5. Captura del Mouse en Formularios Windows Forms
      3.7.3.6. Funcionalidad de Arrastrar y Colocar en Formularios Windows Forms
    3.7.4. Cómo: Simular Eventos del Mouse y del Teclado en el Código
    3.7.5. Validación de los Datos Proporcionados por el Usuario en Formularios
  3.8. Cuadros de Diálogo en Formularios Windows Forms
    3.8.1. Cómo: Mostrar Cuadros de Mensaje
    3.8.2. Cómo: Crear Cuadros de Diálogo en Tiempo de Diseño
    3.8.3. Cómo: Recuperar Información del Formulario Primario de un Cuadro de Diálogo
    3.8.4. Cómo: Recuperar la Información de un Cuadro de Diálogo Selectivamente mediante Múltiples Propiedades
    3.8.5. Cómo: Recuperar el Resultado de los Cuadros de Diálogo
    3.8.6. Cómo: Cerrar Cuadros de Diálogo y Conservar Datos Introducidos por Usuario
    3.8.7. Introducción de Datos por el Usuario en los Cuadros de Diálogo
    3.8.8. Tutorial: Recuperar la Información de un Cuadro de Diálogo Colectivamente mediante Objetos
  3.9. Enlace de Datos en Formularios Windows Forms
    3.9.1. Enlace de Datos y Formularios Windows Forms
    3.9.2. Orígenes de Datos Compatibles con Formularios Windows Forms
    3.9.3. Interfaces Relacionadas con el Enlace de Datos
    3.9.4. Notificación de Cambios en el Enlace de Datos de Windows Forms
    3.9.5. Cómo: Desplazarse por Datos en Formularios Windows Forms
    3.9.6. Cómo: Implementar la Interfaz INotifyPropertyChanged
    3.9.7. Cómo: Aplicar el Modelo PropertyNameChanged
    3.9.8. Cómo: Garantizar que Varios Controles Enlazados al mismo Origen de Datos Permanezcan Sincronizados
    3.9.9. Cómo: Garantizar que la Fila Seleccionada de una Tabla Secundaria Conserva la Posición Correcta
    3.9.10. Cómo: Crear un Control con Enlace Simple en un Formulario Windows Forms
    3.9.11. Cómo: Crear un Control Enlazado y Aplicar Formato a los Datos Mostrados
  3.10. Seguridad en los Formularios Windows Forms
    3.10.1. Información General sobre la Seguridad en Formularios Windows Forms
    3.10.2. Acceso más Seguro a Archivos y Datos en Formularios Windows Forms
    3.10.3. Impresión más Segura en Formularios Windows Forms
    3.10.4. Consideraciones de Seguridad Adicionales en Formularios Windows Forms
  3.11. Cómo: Obtener Acceso a Colecciones con Claves en Formularios Windows Forms
4. Mejorar las Aplicaciones de Windows Forms
  4.1. Configuración de la Aplicación en Formularios Windows Forms
    4.1.1. Introducción a la Configuración de la Aplicación
    4.1.2. Arquitectura de Configuración de la Aplicación
    4.1.3. Atributos de Configuración de la Aplicación
    4.1.4. Configuración de la Aplicación para Controles Personalizados
    4.1.5. Utilizar Valores de Configuración de Aplicación y de Usuario
      4.1.5.1. Cómo: Crear un Nuevo Valor de Configuración en Tiempo de Diseño
      4.1.5.2. Cómo: Cambiar el Valor de una Opción de Configuración Existente en Tiempo de Diseño
      4.1.5.3. Cómo: Cambiar el Valor de una Opción de Configuración entre Sesiones de Aplicación
    4.1.6. Cómo: Validar la Configuración de la Aplicación
    4.1.7. Cómo: Crear la Configuración de la Aplicación
    4.1.8. Cómo: Crear una Configuración de Aplicación mediante el Diseñador
    4.1.9. Cómo: Enlazar una Propiedad a un Valor de Aplicación Existente mediante el Diseñador
    4.1.10. Cómo: Modificar un Enlace de Propiedades para la Configuración de la Aplicación mediante el Diseñador
    4.1.11. Depurar Aplicaciones de Windows Forms que Utilizan la Configuración de Aplicación con Visual Studio
  4.2. Funcionalidad para Imprimir en Formularios Windows Forms
    4.2.1. Cómo: Crear Trabajos de Impresión Estándar de Formularios Windows Forms
    4.2.2. Cómo: Capturar Datos Proporcionados por el Usuario de un Componente PrintDialog en Tiempo de Ejecución
    4.2.3. Cómo: Seleccionar las Impresoras Conectadas al Equipo de un Usuario
    4.2.4. Cómo: Imprimir Gráficos en Formularios Windows Forms
    4.2.5. Cómo: Imprimir un Archivo de Texto de Varias Páginas en Formularios
    4.2.6. Cómo: Completar Trabajos de Impresión de Formularios Windows Forms
    4.2.7. Cómo: Imprimir en Formularios Windows Forms Usando la Vista Preliminar
  4.3. Compatibilidad con las Operaciones de Arrastrar y Colocar y con el Portapapeles
    4.3.1. Tutorial: Llevar a cabo una Operación de Arrastrar y Colocar en Formularios
    4.3.2. Cómo: Agregar Datos al Portapapeles
    4.3.3. Cómo: Recuperar Datos del Portapapeles
    4.3.4. Cómo: Llevar a cabo Operaciones de Arrastrar y Colocar entre Aplicaciones
  4.4. Funciones de Red en las Aplicaciones de Windows Forms
    4.4.1. Tutorial: Llamar a los Servicios Web XML Desde un Formulario Windows Forms
  4.5. Globalizar Formularios Windows Forms
    4.5.1. Fuentes Internacionales en Formularios Windows Forms y Controles
    4.5.2. Visualización de Caracteres Asiáticos con la Propiedad ImeMode
    4.5.3. Compatibilidad Bidireccional en las Aplicaciones de Windows Forms
    4.5.4. Codificación y Globalización de Formularios Windows Forms
    4.5.5. Tutorial: Adaptar Formularios Windows Forms
    4.5.6. Tutorial: Crear un Diseño que Ajuste las Proporciones para la Localización
    4.5.7. Cómo: Admitir la Localización en Formularios Windows Forms mediante AutoSize y el Control TableLayoutPanel
    4.5.8. Cómo: Mostrar Texto de Derecha a Izquierda en Formularios Windows Forms para la Globalización
    4.5.9. Cómo: Establecer la Referencia Cultural y la Referencia Cultural de la Interfaz de Usuario para la Globalización de Formularios Windows Forms
    4.5.10. Cómo: Crear Cuadros de Mensaje en Formularios Windows Forms Bidireccionales
    4.5.11. Cómo: Crear Controles y Formularios Windows Forms Reflejados
    4.5.12. Implementación y Localización de ClickOnce
  4.6. Información del Sistema y Formularios Windows Forms
  4.7. Administración de Energía en Formularios Windows Forms
  4.8. Características de Windows XP y Controles de Formularios Windows Forms
  4.9. Herencia Visual de Formularios Windows Forms
    4.9.1. Cómo: Heredar Formularios Windows Forms
    4.9.2. Cómo: Heredar Formularios mediante el Cuadro de Diálogo Selector de Herencia
    4.9.3. Efectos de Modificar la Apariencia de un Formulario Base
    4.9.4. Tutorial: Demostración de la Herencia Visual
    4.9.5. Cómo: Utilizar las Propiedades Modifiers y GenerateMember
  4.10. Aplicaciones de Interfaz de Múltiples Documentos (MDI)
    4.10.1. Cómo: Crear Formularios Principales MDI
    4.10.2. Cómo: Crear Formularios MDI Secundarios
    4.10.3. Cómo: Determinar el Formulario Secundario MDI Activo
    4.10.4. Cómo: Enviar Datos al Formulario Secundario MDI Activo
    4.10.5. Cómo: Organizar Formularios MDI Secundarios
  4.11. Integrar la Ayuda de Usuario en Formularios Windows Forms
    4.11.1. Cómo: Proporcionar Ayuda en una Aplicación para Windows
    4.11.2. Cómo: Mostrar Ayuda Emergente
    4.11.3. Controlar la Ayuda mediante Información sobre Herramientas
  4.12. Accesibilidad de Formularios Windows Forms
    4.12.1. Tutorial: Crear una Aplicación Accesible basada en Windows
    4.12.2. Propiedades de los Controles de Formularios Windows que Admiten las Directrices de Accesibilidad.

Descarga
MSDN_Manual_Windows_Forms_3.5

jueves, 28 de enero de 2016

Videos Curso ASP.NET MVC & JavaScript Desysweb (Parte 1)

Videos del Curso ASP.NET MVC & JavaScript Desysweb (Parte 1)

Comparto la primera parte de otro curso de ASP.NET MVC & JavaScript realizado en la Empresa Desysweb donde todo se trabaja en forma desconectada usando en el Servidor mi Serializador de Cadenas y JavaScript en el Cliente, sobre todo Matrices.

1. Curso MVC & JavaScript Desysweb - Demo 01

En este video se muestra como trabajar con Listas de 2 formas:
- Consulta Síncrona usando el control MVC WebGrid que envia HTML
- Consulta Asíncrona usando XHR y enviando String que son usados para crear una Tabla por JavaScript en el Cliente.

Esta segunda forma es mas eficiente ya que solo se envía los datos (cadenas separadas por un caracter) y  en el cliente se construye el HTML usando JavaScript.


2. Curso MVC & JavaScript Desysweb - Demo 02

En este video se muestra como crear una Consulta Asíncrona usando XmlHttpRequest (XHR) enviando Cadenas (String) mediante un serializador personalizado y creando una tabla HTML en JavaScript.

Para el ejemplo se trabaja con una lista de Productos: Código, Nombre, Id del Proveedor, Nombre del Proveedor, Id de la Categoría, Nombre de la Categoría, Precio Unitario y Stock.


3. Curso MVC & JavaScript Desysweb - Demo 03

En este video se muestra como crear un filtro desconectado mediante un ComboBox y usando solo Cadenas en JavaScript.

Para el ejemplo se muestra en un ComboBox las Categorías y al seleccionar una se muestran los Productos por Categoría, pero todo es en el lado del cliente usando JavaScript.


4. Curso MVC & JavaScript Desysweb - Demo 04

En este video se enseña como crear un filtro desconectado mediante las cabeceras de la tabla usando controles de texto para filtrar cada campo, el filtro se hace solo usando Cadenas.

El ejemplo es con la tabla productos y se puede filtrar por código, nombre, proveedor, categoría, precio y stock mediante JavaScript.


5. Curso MVC & JavaScript Desysweb - Demo 05

En este video se enseña como crear un filtro desconectado mediante las cabeceras de la tabla usando controles de textos y combos para filtrar cada campo.

El ejemplo es con la tabla productos y se puede filtrar por código, nombre, proveedor, categoría, precio y stock mediante JavaScript.


6. Curso MVC & JavaScript Desysweb - Demo 06

En este video se muestra como trabajar con matrices y ocultar columnas en la presentación, para lo cual se listan los datos de los productos sin incluir el código del proveedor ni el código de la categoría.

Al seleccionar un producto se muestra un popup con su detalle donde si se muestran todos los datos, incluyendo los ocultos, el cual se realiza usando una búsqueda en la matriz.

Cabe resaltar que en este ejemplo no se usan dos páginas sino dos divs, uno para la lista y el otro para el detalle, lo que hace más rápido la visualización de los datos.


7. Curso MVC & JavaScript Desysweb - Demo 07

En este video se muestra como ordenar columnas en forma ascendente y descendente usando matrices en JavaScript.

Para el ejemplo se crean enlaces en la cabecera de la tabla, los cuales permiten ordenar sobre cada campo de la tabla productos, el primer clic ordena en forma ascendente y el segundo ordena en forma descendente mostrándose el símbolo respectivo.


8. Curso MVC & JavaScript Desysweb - Demo 08

En este video se muestra como paginar registros usando matrices en el cliente usando JavaScript. La paginación consta de enlaces (links) con los números de páginas y a los extremos los botones de avance por bloques, en el caso de que sean demasiadas páginas.

En este ejemplo se usan enlaces (a hrefs) para la paginación los cuales se encuentran sobre una lista de viñetas que se visualizan como botones gracias a la hija de estilos.


9. Curso MVC & JavaScript Desysweb - Demo 09

En este video se muestra como hacer las 3 operaciones en forma conjunta, es decir, paginar registros, ordenar columnas y filtrar registros en el cliente (desconectado) usando matrices en JavaScript.

El ejemplo es con la lista de productos y los datos están paginados y por bloques, también las columnas se pueden ordenar en forma ascendente y descendente y finalmente se puede filtrar por cada campo escribiendo sobre los textos de las cabeceras en cada columna de la tabla.


jueves, 15 de enero de 2015

El Demo del Día: ComboBox con Imágen y Múltiples Columnas en WinForms

ComboBox con Imágen y Múltiples Columnas en WinForms

Ayer en el seminario vimos como crear Librerías de Controles para WinForms y no pude completar el último Demo de un Control ComboBox enlazado a Datos que soporte Imagen de Base de Datos y permita visualizar Múltiples Columnas.

Requerimiento

Se desea mostrar la información de los registros en varias columnas en una lista desplegable (ComboBox) y ademas poder incluir al inicio una Imagen también desde un origen de datos.

Solución

Debemos sobre escribir la clase ComboBox de WinForms y crear un par de propiedades llamada "ImageMember" para el campo de imagen y "DataColumns" para la lista de columnas a visualizarse la cual contiene el nombre del campo, el ancho de la columna y la alineación.

El control ComboBox tiene 2 formas de presentación: la Normal y la Dibujada, lo cual se logra cambiar configurando la propiedad "DrawMode". En nuestro caso, modificaremos la propiedad "DrawMode" a "OwnerDrawFixed" y programaremos en el evento "DrawItem" el dibujo con las columnas a presentar y la imagen.

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

Para listar los datos del empleado incluyendo su foto escribir el siguiente código:

Create procedure [dbo].[uspEmployeesListar]
As
Select EmployeeId,LastName,FirstName,IsNull(BirthDate,'1/1/1900') as Birthdate,Photo
From Employees

Actualizar los registros del campo Photo reemplazandolo desde archivo de disco

El campo Foto (Photo) de la tabla Empleados (Employees) de Northwind tiene registros de tipo bmp que no se verán en la aplicación, hay que actualizarlos por archivos jpg desde el disco.

Para eso entrar como Administrador al SQL Managment Studio y ejecutar la siguiente instrucción:

Update Employees Set Photo=(Select img.* from Openrowset(Bulk 'C:\Data\NET\Practicas\WinForms\ComboBox_Imagen_MultiColumna\Empleados\1.jpg', Single_Blob) img) where EmployeeId = 1

Nota: Realizar lo mismo para modificar las imágenes tantos registros tengas en la tabla empleados, para lo cual cambiar el archivo y el Id del Empleado (EmployeeId).

Crear una Aplicación Windows Forms en C#

En Visual Studio crear un proyecto Windows Forms en C# con el nombre de "ComboBox_Imagen_MultiColumna", luego cambiar el nombre del formulario a "frmConsultaEmpleado".

Crear la Clase Entidad del Negocio

Crear la clase beEmpleado escribiendo el siguiente código:

using System;
namespace ComboBox_Imagen_MultiColumna
{
    public class beEmpleado
    {
        public int IdEmpleado { get; set; }
        public string Apellido { get; set; }
        public string Nombre { get; set; }
        public DateTime FechaNacimiento { get; set; }
        public byte[] Foto { get; set; }
    }
}

Crear la Clase de Acceso a Datos

Crear la clase daEmpleado escribiendo el siguiente código:

using System;
using System.Collections.Generic; //List
using System.Data; //CommandType, CommandBehavior
using System.Data.SqlClient; //SqlConnection, SqlCommand, SqlDataReader
namespace ComboBox_Imagen_MultiColumna
{
    public class daEmpleado
    {
        public List<beEmpleado> listar(SqlConnection con)
        {
            List<beEmpleado> lbeEmpleado = null;

            SqlCommand cmd = new SqlCommand("uspEmployeesListar", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlDataReader drd = cmd.ExecuteReader(CommandBehavior.SingleResult);
            if (drd != null)
            {
                lbeEmpleado = new List<beEmpleado>();
                int posIdEmpleado = drd.GetOrdinal("EmployeeID");
                int posApellido = drd.GetOrdinal("LastName");
                int posNombre = drd.GetOrdinal("FirstName");
                int posFechaNacimiento = drd.GetOrdinal("BirthDate");
                int posFoto = drd.GetOrdinal("Photo");
                beEmpleado obeEmpleado;
                while (drd.Read())
                {
                    obeEmpleado = new beEmpleado();
                    obeEmpleado.IdEmpleado = drd.GetInt32(posIdEmpleado);
                    obeEmpleado.Apellido = drd.GetString(posApellido);
                    obeEmpleado.Nombre = drd.GetString(posNombre);
                    obeEmpleado.FechaNacimiento = drd.GetDateTime(posFechaNacimiento);
                    if (!drd.IsDBNull(posFoto)) obeEmpleado.Foto = (byte[])drd.GetValue(posFoto);
                    lbeEmpleado.Add(obeEmpleado);
                }
                drd.Close();
            }

            return (lbeEmpleado);
        }
    }
}

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

Crear la Clase de Reglas del Negocio

Crear la clase brEmpleado escribiendo el siguiente código:

using System;
using System.Configuration; //ConfigurationManager
using System.Data.SqlClient; //SqlConnection
using System.Collections.Generic; //List
namespace ComboBox_Imagen_MultiColumna
{
    public class brEmpleado
    {
        public List<beEmpleado> listar()
        {
            List<beEmpleado> lbeEmpleado = null;
            string conexion = ConfigurationManager.ConnectionStrings["conNW"].ConnectionString;
            using (SqlConnection con = new SqlConnection(conexion))
            {
                try
                {
                    con.Open();
                    daEmpleado odaEmpleado = new daEmpleado();
                    lbeEmpleado = odaEmpleado.listar(con);
                }
                catch (SqlException ex)
                {
                    //grabarLog(ex);
                }
                catch (Exception ex)
                {
                    //grabarLog(ex);
                }
            } //con.Close(); con.Dispose();
            return (lbeEmpleado);
        }
    }
}

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 una Clase Entidad para configurar las Columnas del Combo

Crear la clase "DataColumn" escribiendo el siguiente código:

using System.Windows.Forms;
namespace ComboBox_Imagen_MultiColumna
{
    public class DataColumn
    {
        public string ColumnName { get; set; }
        public string HeaderText { get; set; }
        public int ColumnWidth { get; set; }
        public HorizontalAlignment Alignment { get; set; }
    }
}

Crear una Clase para el ComboBox con Imagen y Múltiples Columnas

Crear la clase "ComboImage" que herede del ComboBox escribiendo el siguiente código:

using System;
using System.Text;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;

namespace ComboBox_Imagen_MultiColumna
{
    public class ComboImage:ComboBox
    {
        private dynamic dataSource;
        public string ImageMember { get; set; }
        public List<DataColumn> DataColumns { get; set; }

        public ComboImage()
        {
            this.ItemHeight = 25;
            this.DrawMode = DrawMode.OwnerDrawFixed;
            this.DrawItem += new DrawItemEventHandler(dibujarElemento);
            this.MeasureItem += new MeasureItemEventHandler(configurarTamaño);
        }

        private void dibujarElemento(object sender, DrawItemEventArgs e)
        {
            int x = e.Bounds.X;
            int y = e.Bounds.Y;
            int indice = e.Index;
            dataSource = DataSource;
            string item="";          
            if (DataColumns != null && DataColumns.Count > 0)
            {
                StringBuilder sb = new StringBuilder("");
                DataColumn columna;
                string valor = "";
                for (int i = 0; i < DataColumns.Count; i++)
                {
                    columna = DataColumns[i];
                    valor = dataSource[indice].GetType().GetProperty(columna.ColumnName).
                                GetValue(dataSource[indice], null).ToString();
                    if (columna.Alignment.Equals(HorizontalAlignment.Right))
                        sb.Append(String.Format("{0} │ ", valor.PadLeft(columna.ColumnWidth, ' ')));
                    else sb.Append(String.Format("{0} │ ", valor.PadRight(columna.ColumnWidth, ' ')));
                }
                item = sb.ToString();
            }
            else
            {
                if (!String.IsNullOrEmpty(DisplayMember))
                {
                    item = dataSource[indice].GetType().GetProperty(DisplayMember).
                               GetValue(dataSource[indice], null).ToString();
                }
            }
            if (!String.IsNullOrEmpty(ImageMember))
            {
                byte[] buffer = dataSource[indice].GetType().GetProperty(ImageMember).
                                         GetValue(dataSource[indice], null);
                if (buffer != null && buffer.Length > 0)
                {
                    MemoryStream ms = new MemoryStream(buffer);
                    Image img = null;
                    try{
                        img = Image.FromStream(ms);
                        e.Graphics.DrawImage(img, x, y, 25, 25);
                    }
                    catch(Exception ex)
                    {
                        //Grabar Log
                    }                                    
                }
                x = x + 20;
            }
            e.Graphics.DrawString(item, new Font("Courier New", 8), Brushes.Black, x, y+5);
            e.DrawFocusRectangle();
        }

        private void configurarTamaño(object sender, MeasureItemEventArgs e)
        {
            e.ItemWidth = this.Width;
            e.ItemHeight = 200;
        }
    }
}

Nota: Esta clase creada hereda las propiedades DataSource, DisplayMember y ValueMember del ComboBox pero adicionalmente se crean las propiedades DatColumns y ImageMember y se sobre escribe los eventos DrawItem y MeasureItem para dibujar las columnas y la imágen.

Diseñar y Programar el Formulario con el ComboImage creado

Abrir el formulario "frmConsultaEmpleado" y realizar el siguiente diseño:


Escribir el siguiente código en el formulario:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Drawing;
using System.Windows.Forms;

namespace ComboBox_Imagen_MultiColumna
{
    public partial class frmConsultaEmpleado : Form
    {
        private List<beEmpleado> lbeEmpleado;

        public frmConsultaEmpleado()
        {
            InitializeComponent();
        }

        private void listarEmpleados(object sender, EventArgs e)
        {
            brEmpleado obrEmpleado = new brEmpleado();
            lbeEmpleado = obrEmpleado.listar();
            cboEmpleado.DataSource = lbeEmpleado;
            cboEmpleado.DisplayMember = "Apellido";
            cboEmpleado.ValueMember = "IdEmpleado";
            cboEmpleado.ImageMember = "Foto";
            List<DataColumn> columnas = new List<DataColumn>();
            columnas.Add(new DataColumn { ColumnName="IdEmpleado",
                ColumnWidth=3, Alignment=HorizontalAlignment.Right});
            columnas.Add(new DataColumn { ColumnName = "Apellido",
                ColumnWidth = 20, Alignment = HorizontalAlignment.Left });
            columnas.Add(new DataColumn { ColumnName = "Nombre",
                ColumnWidth = 10, Alignment = HorizontalAlignment.Left });
            cboEmpleado.DataColumns = columnas;
            cboEmpleado.SelectedIndex = -1;
        }

        private void mostrarEmpleadoSeleccionado(object sender, EventArgs e)
        {
            int n = cboEmpleado.SelectedIndex;
            if (n > -1)
            {
                txtCodigo.Text = lbeEmpleado[n].IdEmpleado.ToString();
                txtApellido.Text = lbeEmpleado[n].Apellido;
                txtNombre.Text = lbeEmpleado[n].Nombre;
                txtFechaNacimiento.Text = lbeEmpleado[n].FechaNacimiento.ToShortDateString();
                byte[] foto = lbeEmpleado[n].Foto;
                MemoryStream ms = new MemoryStream(foto);
                try
                {
                    picFoto.Image = Image.FromStream(ms);
                }
                catch (Exception ex)
                {
                    picFoto.Image = null;
                }
            }
            else
            {
                txtCodigo.Clear();
                txtApellido.Clear();
                txtNombre.Clear();
                txtFechaNacimiento.Clear();
                picFoto.Image = null;
            }
        }
    }
}

Nota: Asociar al evento "load" del formulario la función "listarEmpleados" y al evento "SelectedIndexChanged" del ComboImage llamado "cboEmpleado" la función "mostrarEmpleadoSeleccionado".

Modificar el archivo App.Config para incluir la Cadena de Conexión

<?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=NW"/>
  </connectionStrings>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

Probar la Aplicación Windows Forms

Grabar la aplicación y ejecutarla con F5. Desplegar el ComboBox y se mostrará la siguiente ventana:


Seleccionar un registro y se mostrará los datos del empleado, tal como se muestra a continuación:


Nota: La consulta es desconectada ya que los datos del empleado se obtienen de la Lista de Objetos.

Comentario Final

En este post vimos como mostrar en un ComboBox de WinForms múltiples columnas y también imágenes, para lo cual creamos un control personalizado configurando la propiedad "DrawMode" y agregamos propiedades "ImageMember" y "DataColumns", luego dibujamos en el evento "DrawItem".

Como ven no es tan díficil crear tus propios controles personalizados, como siempre nos ayudamos con un poco de Reflection para obtener propiedades (nombres y valores).

Espero les sirva.

Descarga
Demo_ComboBox_Imagen_MultiColumna