Personalizando controles de .NET

En un proyecto reciente me topé con algunos detalles que me parecieron incómodos de .NET.

El primero fue con los TextBoxes. Quería que al posicionar el cursor sobre ellos, se seleccionara automáticamente todo el texto. Nunca encontré una propiedad que lo hiciera, y de todos modos, sería molesto estar modificando esa propiedad en cada uno.

Esto también me afectaba en el MaskedTextBox. Si por ejemplo, tienes una máscara de cuatro dígitos, puedes poner el cursor en cualquiera de las cuatro posiciones y escribir a partir de ahí. Entonces, quise que desde el principio esté todo el cuadro seleccionado y, además, que al quitar el cursor se ajuste el texto de nuevo todo a la izquierda.

¿Qué es lo más fácil en estos casos? Hacer un control que herede de estos.

Esto es programación orientada a objetos. En .NET toda clase puede heredarse a menos que se indique lo contrario.

Este ejemplo va a ser sencillo. Sólo crearé las dos clases que modifican estos controles, y las funciones que necesitan.

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace MisControles
{
    [ToolboxBitmap(typeof(TextBox))]
    internal class MyTextBox : TextBox
    {
        protected override void OnGotFocus(EventArgs e)
        {
            base.OnGotFocus(e);
            this.SelectAll();
        }
    }

    [ToolboxBitmap(typeof(MaskedTextBox))]
    internal class MyMaskedTextBox : MaskedTextBox
    {
        protected override void OnGotFocus(EventArgs e)
        {
            base.OnGotFocus(e);
            this.SelectAll();
        }
        protected override void OnLostFocus(EventArgs e)
        {
            base.OnLostFocus(e);
            string text = this.Text.Trim();
            this.Text = text;
        }
    }
}

ToolboxBitmap es el ícono que mis controles van a llevar en la barra de herramientas (toolbox) de Visual Studio. Puede indicarse el nombre de una imagen, pero en mi caso, le indico que va a usar el mismo que el del control del que heredan. Los declaré con la palabra internal porque los creé dentro del proyecto, y quedarán protegidos dentro del mismo ensamblado (es decir, la aplicación). Si los hacemos en una librería de clases, deben ser declarados como públicos (public).

La clase TextBox tiene un método protegido (protected) llamado OnGotFocus. Se declara como protegido para que sea visible únicamente dentro del código de su misma clase y el de los controles que heredan de ella, y también se declara como virtual, para que pueda ser "sobreescrito" por las clases herederas.

De hecho, los métodos OnGotFocus y OnLostFocus de MaskedTextBox en realidad pertenecen a TextBox, de la cual hereda aquella.

Para sobreescribir los métodos virtuales utilizamos la palabra override. Dentro de un método sobreescrito podemos invocar al método original por medio del objeto base, que se refiere a la clase padre. Esta llamada la podemos hacer en cualquier parte del código, o incluso omitirla.

Terminado esto, compilamos el proyecto y nuestros controles aparecerán en la vista de diseño del proyecto. Si es una librería de clases, podemos agregarlos al toolbox y de ahí, insertarlos a cualquier proyecto. La dll será agregada como referencia automáticamente.

Algo que debemos recordar es que para que los cambios en los controles apliquen en el entorno visual de la aplicación, es necesario primero compilar el proyecto con donde se encuentran.

Anuncio publicitario

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s