En esta clase vimos introduccion a controles “customizados” (custom controls), y nos enfocamos a la tecnica de extender (agregar funcionalidad a) controles ya existentes…  El ejemplo desarrollado en clase fue extender un TextBox de tal manera que nos validara si el texto contenido en el es un correo electronico (email) valido. 

Determinamos algunas reglas que una cadena debe cumplir para considerarla un email valido, siendo estas:

i. que solo contenga una arroba (@).
ii. que exista un punto (.) despues de la posicion de la arroba.
iii. que la cadena tuviera al menos una letra despues del ultimo punto; o bien, que la cadena no termine en punto.

Vimos como podemos notificarle al usuario en caso de que el “email” proporcionado no cumpliera con todas las reglas que determinamos.  Podemos implementar notificaciones intrusivas y no-intrusivas.

Las intrusivas de las que platicamos fueron: – desplegar un MessageBox, – atrapar el foco de la aplicacion en nuestro control hasta que se proporcione un correo valido.

Y la no-intrusiva (y por la que optamos implementar): – cambiar la visualizacion del control.

Cuando se proporcione una cadena que no cumple con las reglas determinadas, nuestro control cambiara a fondo rojo, y letras amarillas, cuando la entrada sea valida, cambiara a fondo blanco con letras negras.

Desarrollo en Visual Studio

Empezamos por crear un proyecto de aplicacion para windows, seguido por agregar otro proyecto a la solucion de biblioteca de controles.  Por defecto, la aplicacion de windows cuenta con el archivo Form1, y la biblioteca de controles con el archivo UserControl1.  Renombramos el UserControl1 a EmailInput.

a continuacion el codigo para EmailInput: (agregar un TextBox en la posicion 0,0)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace MisControles
{
  public partial class EmailInput : UserControl
  {
  private bool _isValid = false;
  public bool IsValid {
  get { return _isValid; }
  //set { _isValid = value; }
  }
public EmailInput()
  {
  InitializeComponent();
  }
private void UserControl1_Load(object sender, EventArgs e)
  {
  //se dispara cuando se agrega este control
  // a una forma
  UserControl1_Resize(this, new EventArgs());
  }
private void UserControl1_Resize(object sender, EventArgs e)
  {
  textBox1.Width = this.Width;
  this.Height = textBox1.Height;
  }
private void textBox1_Leave(object sender, EventArgs e)
  {
  //comprobar que existe arroba
  if (textBox1.Text.Contains("@") == false) {
  //el texto no contiene arroba
  textBox1.BackColor = Color.FromArgb(255,0,0); //Color.Red
  textBox1.ForeColor = Color.Yellow;
  _isValid = false;
  return;
  }
  //comprobar que solo existe una arroba
  string[] pedazos = textBox1.Text.Split('@');
  if (pedazos.Length != 2) {
  textBox1.BackColor = Color.FromArgb(255, 0, 0); //Color.Red
  textBox1.ForeColor = Color.Yellow;
  _isValid = false;
  return;
  }
  //comprobar que existe un punto despues de la arroba
  int pos_arroba = textBox1.Text.IndexOf("@");
  int pos_ultimo_punto = textBox1.Text.LastIndexOf(".");
  if (pos_ultimo_punto < pos_arroba) {
  textBox1.BackColor = Color.FromArgb(255, 0, 0); //Color.Red
  textBox1.ForeColor = Color.Yellow;
  _isValid = false;
  return;
  }
  //comprobar que existen al menos 1 letra despues del ultimo punto
  if(textBox1.Text.EndsWith(".")){
  textBox1.BackColor = Color.FromArgb(255, 0, 0); //Color.Red
  textBox1.ForeColor = Color.Yellow;
  _isValid = false;
  return;
  }
  if (textBox1.Text.Contains(" ")) {
  textBox1.BackColor = Color.FromArgb(255, 0, 0); //Color.Red
  textBox1.ForeColor = Color.Yellow;
  _isValid = false;
  return;
  }
  textBox1.BackColor = Color.FromArgb(255, 255, 255); //Color.White
  textBox1.ForeColor = Color.Black;
  _isValid = true;
  }
  }
}
La logica de las reglas establecidas se corre cada vez que el usuario sale de nuestro control, con el metodo textBox1_Leave que esta asociado al evento Leave del TextBox.  Otra opcion pudo ser que la logica se corriera con cada tecla que el usuario presione, para esto el metodo se puede asociar al evento KeyPress del Textbox: textBox1.KeyPress += new EventHandler(textBox1_Leave).

La logica de las reglas incluye el manejo de una variable privada _isValid, donde guardamos si el control contiene un email valido o no.  Esta propiedad privada la exponemos como propiedad publica pero ReadOnly (solo lectura) para que el programador que utilice nuestro validador de correos pueda determinar si contiene uno valido o no.

     if ( emailInput1.IsValid ) // mandar el correo !!

descarga del proyecto completo: Proyecto Completo
nota obligatoria, renombrar el archivo a .rar

Otros conceptos vistos la clase:
String.Contains, String.StartsWith, String.EndsWith, Color.Black, Color.Red, Color.FromArgb, String.IndexOf, String.LastIndexOf, TextBox.ForeColor, TextBox.BackColor, UserControl.Width, UserControl.Height, ..

Screen..

Les presento a Form1 corriendo, contiene dos EmailInput‘s (control desarrollado en clase) y un Button donde podemos preguntarle a los emailInputs si contienen emails validos…

emailInputs in action