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

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.

El Libro del Día: Async Javascript

El Libro del Día: 2015-01-15

Titulo: Async Javascript
Autor: Trevor Burnham
Editorial: The Pragmatic Programmers
Nro Paginas: 97



Capítulos:
1. Understanding JavaScript Events
2. Distributing Events
3. Promises and Deferreds
4. Flow Control with Async.js
5. Multithreading with Workers
6. Async Script Loading
A1. Tools for Taming JavaScript

Descarga:
Async_Javascript

miércoles, 14 de enero de 2015

El Libro del Día: Professional WCF 4

El Libro del Día: 2015-01-14

Titulo: Professional WCF 4
Autor: Pablo Cibraro, Kurt Claeys, Fabio Cozzolino, Johann Grabner
Editorial: Wrox
Nro Paginas: 483

Capítulos:
CHAPTER 1 Design Principles and Patterns
CHAPTER 2 Service Contracts and Data Contracts
CHAPTER 3 Bindings
CHAPTER 4 Clients
CHAPTER 5 Instancing
CHAPTER 6 Workflow Services
CHAPTER 7 Understanding WCF Security
CHAPTER 8 WCF Security in Action
CHAPTER 9 Federated Authentication in WCF
CHAPTER 10 Windows Azure Platform AppFabric
CHAPTER 11 Creating a SOA Case
CHAPTER 12 Creating the Communication and Integration Case
CHAPTER 13 Creating the Business Process
CHAPTER 14 Hosting

Descarga:
Professional_WCF_4

martes, 13 de enero de 2015

Personajes de la Computación - Yahoo!

Personajes de la Computación - Yahoo!

Prólogo

Durante casi 2 décadas la plataforma de Desarrollo es la Web, teniendo 2 grandes componentes:
- Front End: HTML, CSS, JavaScript, Data (XML, JSON, etc).
- Back End: Servidor Web, Páginas del Servidor, Base de Datos, etc.

En este contexto, existe mucha literatura sobre como desarrollar aplicaciones para la web, pero pocas dan énfasis a los 3 temas mas importantes en aplicaciones web y móviles:
- Seguridad
- Performance
- Escalabilidad

En este post presento una compilación de algunos personajes que han trabajado para Yahoo! los cuales nos han dejado una gran obra sobre todo en el tema de "Performance Web Sites" y "Buenas Practicas de Desarrollo", empezando por grandes maestros como Douglas Crockford y Steve Souders, asi como nuevos talentos, tales como Nicholas C. Zakas y Stoyan Stefanov, entre otros.

En mi blog he posteado mas de 250 libros hasta el momento, pero los que voy a publicar a continuación son los mas importantes, los pioneros y casi únicos libros sobre el tema de "Performance" y  "Buenas Prácticas en JavaScript".

En el Perú todavía tenemos roles tradicionales en el área de desarrollo como: programador, analista, arquitecto, tester, soporte, etc. En USA, cada vez cobra mas importancia los roles de:
- Ingeniero y Arquitecto JavaScript
- Ingeniero y Arquitecto en Web Performance

Para todos los que quieren convertirse en Ingenieros (nivel inicial) y Arquitectos (siguiente nivel) de JavaScript y Web Performance, les dejo los libros que son indispensables leer y en donde esta como mejorar nuestros sitios web y nuestras aplicaciones.

Sobre Yahoo

Yahoo! es una empresa de medios globales creada en 1994 por dos estudiantes de postgrado de la Universidad de Stanford: Jerry Jang (Taiwan) y David Filo (USA), pero recién se constituyo como empresa en 1995.

Entre sus productos principales tenemos:
- Yahoo Search
- Yahoo Mail
- Yahoo Messenger
- Yahoo Grupos
- Yahoo Juegos
- Yahoo Compras
- Yahoo Subastas

En cuanto a desarrollo crearon una Librería de JavaScript llamada YUI Library que lamentablemente dejo de tener soporte desde el año pasado y en los últimos años no le fue también a Yahoo! y dejo ir a sus principales ingenieros y arquitectos.

Nota: Actualmente, ante el convenio con Mozilla firmado a finales del 2014, en el cual Firefox tiene como buscador predeterminado a Yahoo Search y No a Google Search, su participación en el mercado ha mejorado.

Jerry Yang y David Filo

Pais Origen: Taiwan y USA
Año de Nacimiento: 1968 y 1966
Fundadores de: Yahoo (1995)


Enlaces
Yahoo
Jerry_Yang
David_Filo

Douglas Crockford

País Origen: USA
Creador de: JSON (2001)
Especialista en: JavaScript
Trabajo Actual: PayPal


Enlaces
Douglas_Crockford
Videos_Crockford_YUI_Library

Libros
DouglasCrockford_2008_JavaScriptTheGoodParts


Steve Souders

País Origen: USA
Especialista en: Web Performance
Creador de: YSlow, HTTP Archive, Cuzillion, jDrop, SpriteMe, ControlJS, BrowserScope
Co-Fundador: Firebug Working Group
Trabajo Actual: Google


Enlaces
Google+
Sitio_Web
Amazon

Libros
SteveSouders_2007_HighPerformanceWebSites



SteveSouders_2009_EvenFasterWebSites



Nicholas C. Zakas

Pais Origen: USA
Especialista en: Web Performance, JavaScript
Contribuidor de: YUI Library
Creador de: Cookie Utilitie, Profiler, YUI Test
Trabajo Actual: Box


Enlaces
Blog
Linked In
Twitter

Libros
NicholasZakas_2007_O'Reilly_ProfessionalAjax



NicholasZakas_2010_O'Reilly_HighPerformanceJavaScript



NicholasZakas_2012_O'Reilly_MaintainableJavaScript



NicholasZakas_2012_Wrox_ProfessionalJavascriptForWebDevelopers


NicholasZakas_2014_NoStarchPress_ThePrinciplesObjectOrientedJavaScript


Stoyan Stefanov

Pais Origen: USA
Especialista en: Web Performance, JavaScript
Co Creador de: Smush.it, YSlow 2.0
Trabajo Actual: Yahoo


Enlaces
Google+
Blog
Twitter

Libros
StoyanStefanov_2008_Packt_ObjectOrientedJavaScript


StoyanStefanov_2010_O'Reilly_JavaScriptPatterns


StoyanStefanov_2012_O'Reilly_WebPerformanceDaybookVolume2


Cal Henderson

Pais Origen: Inglaterra
Año de Nacimiento: 1981
Especialista en: Web Performance, Scalability
Co-Fundador de: B3ta
Trabajo Actual: Tiny Speck


Enlaces
Cal_Henderson

Libros
CalHenderson_2006_O'Reilly_BuildingScalableWebSites


Kyle Loudon

Pais Origen: USA
Especialista en: Web-Mobile Apps, Scalability
Co-Creador: Apple iPod (2011 Pixo)
Trabajo Actual: Realtor.com


Enlaces
Sitio_Web

Libros
KyleLoudon_2010_O'Reilly_DevelopingLargeWebApplications



Comentario Final

Mi comentario final, es que este post pudo haberse llamado "Performance Web Sites" ya que tiene los pocos libros que hay sobre el tema escritos por expertos que trabajaron en Yahoo y que la mayoría esta actualmente en otras empresas, pero nos dejaron sus experiencias en estos libros.

Se que para la mayoría de personas, incluyendo muchos visitantes del blog, consideran que lo mas importante son los Demos que publico, los cuales son los post mas vistos, pero la idea del blog era mejorar el nivel de los desarrolladores, sobre todo de los "expertos" y justamente los Libros que publico son la principal materia prima para lograrlo, aunque muchos parecen no entender y luego están preguntando:
- Como hago que mi sitio sea seguro
- Como hago para dar velocidad a mis paginas
- Como hago para que no se bloquee el acceso a las paginas, etc.

La respuesta la encontrarás en la teoría de los grandes maestros (gurus, super expertos o como quieran llamarles).

Este post costo mucho tiempo en compilarlo, esperando que sea de su agrado y colaborar con un poco de historia y material de estudio obligatorio.

Finalmente, les comento una frase: "Dime que lees y te diré como quien quieres ser".

PD: "Y si no lees nada no quieres ser nada".

El Libro del Día: Programming WCF Services

El Libro del Día: 2015-01-13

Titulo: Programming WCF Services
Autor: Juval Löwy
Editorial: O'Reilly
Nro Paginas: 910

Capítulos:
1. WCF Essentials
2. Service Contracts
3. Data Contracts
4. Instance Management
5. Operations
6. Faults
7. Transactions
8. Concurrency Management
9. Queued Services
10. Security
11. The Service Bus
A. Introduction to Service Orientation
B. Headers and Contexts
C. Discovery
D. Publish-Subscribe Service
E. Generic Interceptor
F. WCF Coding Standard
G. ServiceModelEx Catalog

Descarga:
Programming_WCF_Services

lunes, 12 de enero de 2015

Entrenamiento - Tercer Seminario .NET (Reflection y Creación de Librerías de Controles WinForms)

Tercer Seminario .NET: Reflection y Creación de Librerías de Controles WinForms

Este Miércoles 14 de Enero continuaremos con los Seminarios de .NET, esta vez para conocer mas a fondo "Reflection" y su uso en la "Creación de Librería de Controles".

Los que asistan verán muchas Demos reales de controles que le serán útiles en su desarrollo, tales como:

- Log de Objetos Recursivo
- Buscador de Miembros en Múltiples Assemblies
- Texto con Formato Numérico, Cadena, Fecha
- ListView con DataSource
- TreeView con DataSource
- DataGridView Paginado
- Búsqueda de Datos
- Ubigeo (Dpto, Prov, Dist)

La inversión del Seminario es de 40 soles sin certificado y 60 soles con certificado.

El lugar es en el Auditorio CEFAS en Jr Manuel Segura 271 Santa Beatriz (Lima) altura de la cuadra 15 de la Av Arequipa.

La entrada es a partir de las 6:30 pm y el seminario es de 7:00 pm a 10:00 pm.

Los interesados deberán enviar un correo a: Luis.duenash@gmail.com con copia a informes@hte.com.pe confirmando su participación.

Los esperamos.