CustomControls I: Empezando

ForTutorial NET

Veremos que es un custom control, ejemplos de custom controls y como crear uno sencillo. En este caso crearemos un textbox que compruebe el tipo de datos, de manera que si ponemos que compruebe números, lo verifique cuando sales del control o seleccionas otro (cuando pierde el foco).

¿Que es?

Un CustomControl es un control(textbox, botones, …) que quieres que haga cosas que no hace, para ello lo heredas o lo haces desde cero. En lugar de programar algo para un formulario, si lo vas a utilizar más, lo que se debe hacer es generalizarlo. Puedes crear tus propias propiedades, funciones, eventos, … Puedes hasta unir varios controles, o incluso varios custom controls, en uno solo.

¿Para que sirve?

Hay muchos ejemplos de utilización de custom controls. Una de las cosas que mas se busca por internet son calendarios mas atractivos o útiles(hay algunos que les pasas una lista de días y otra de colores, y te monta un calendario con días con fondos diferentes o con icono, …)

Mas ejemplos:

  • Un drag & drop (cuando tienes 2 listados y arrastras de uno a otro elementos) no deja de ser un custom control con 2 listView.
  • Un textbox que, cuando pierda el foco, valide si es un número.
  • En entornos de escritorio, si tienes un formulario para rellenar un nuevo albarán, en lugar de poner un textbox para la entidad/empresa a la que va dirigida el albarán, puedes poner un control que te muestre en otra pantalla un listado de entidades, y cuando hagas dobleclick, te seleccione ese.

Como veis pueden ser muchísimas las opciones que tenemos, desde muy sencillas a muy complejas.

Empezamos

Vamos a ver un ejemplo sencillo. En este caso heredaremos de un textBox para hacer que valide si es un número, para ello crearemos una enumeración para que sea mas cómodo, y añadiremos el código de validación en el textbox.

Primero, creamos un nuevo proyecto tipo class library y dentro de este creamos una clase nueva, y yo le pondré el nombre de ccTxtValidator (podéis ponerle cualquier nombre customTextBox, ccTxt, … sera como se vera el nombre). Una vez hecho esto, hacemos que herede del control textbox :

 class ccTxtValidador : System.Windows.Forms.TextBox

Después, en esta clase mismo creamos una enumeración de los tipos de datos (esto, para estar bien, debería estar en otra clase con enumeraciones o utilidades, por si lo necesitamos en mas de un lugar. Para el ejemplo, solo comprobaremos si es un texto ( sería un campo libre), un número entero, o un número con decimales:

   public enum eTipoDatos
   {
      Texto, Entero, Decimal
   }

En la clase del custom control pondremos una propiedad con el tipo de datos ( esto nos irá bien porque en la lista de propiedades del textbox, en esta propiedad en concreto, nos aparecerá un desplegable y no inducirá a error)

  private eTipoDatos _TipoValidacion = eTipoDatos.Texto;
   public eTipoDatos TipoValidacion
   {
     get { return this._TipoValidacion; }
     set { this._TipoValidacion = value; }
   }

Después, generamos una función que compruebe el tipo de datos y que si no coincide con el texto, elimine el contenido. Para ello generamos la función con la firma del lostFocus:

 public void txt_LostFocus(object sender, System.EventArgs e)
 {
    if (_TipoValidacion != eTipoDatos.Texto && this.Text.Trim() != "")
    {
        String strFormato = "";
        if (_TipoValidacion == eTipoDatos.Entero) strFormato = "[0-9]*";
        else if (_TipoValidacion == eTipoDatos.Decimal) strFormato = "[0-9]*,[0-9]*";
        Regex pattern = new Regex(strFormato);
        if (!pattern.IsMatch(this.Text)) this.Text = "";
     }
  }

Y solo nos faltaría que en el constructor indicasemos que el evento lostFocus es la funcion que hemos creado:

 public ccTxtValidador()
  {
    this.LostFocus += new System.EventHandler(this.txt_LostFocus);
  }

En la solución añadimos otro proyecto tipo windows forms y añadimos por referencia el otro proyecto ( siempre aconsejo añadir la referencia de la dll). Después, añadimos un formulario. Nos situamos en la parte de diseño y en el el ToolBox, en teoría en primera posición, debería estar vuestro control con un icono como una rueda de engranaje lila, si no en all windows forms. Si veis que no esta en ninguna de las 2 ubicaciones, darle con el botón derecho/choose items… y agregarlo por dll.

En las propiedades de este control veréis la nueva propiedad. Ahora solo nos haría falta probarlo en cada caso y ya estaría.