Completando el control MaskedTextBox con ceros a la izquierda. Al salir del foco (I)

Tal y como reza el título de este artículo, durante el desarrollo de una aplicación Windows Forms puede haber ocasiones en las que necesitemos que una caja de texto admita solamente valores numéricos, lo cual podemos resolver muy fácilmente mediante un control MaskedTextBox sobre el que establezcamos la máscara de entrada apropiada; pero como requerimiento adicional, supongamos que dicho número debe tener una cantidad determinada de dígitos, que si no son introducidos por el usuario, deberán ser completados con ceros a la izquierda del número significativo.



Para cumplir con este requisito vamos a proponer dos técnicas, que variarán en función de la necesidad de visualizar en el control MaskedTextBox el valor del número completamente formateado durante su fase de edición.


En ambos casos estableceremos la máscara de entrada -propiedad Mask-del control a la cadena “99999”, para que admita solamente números; esta operación podemos hacerla desde el asistente que incorpora el control en su etiqueta inteligente, como vemos en la siguiente figura.



O bien mediante código, por ejemplo, en el evento Load del formulario.


private void frmSalirFoco_Load(object sender, EventArgs e)
{
this.maskedTextBox1.Mask = “99999”;
}

En esta primera entrega del artículo explicaremos cómo completar el contenido del control cuando este pierda el foco, mediante una técnica consistente en aplicar el cero como carácter marcador sobre el MaskedTextBox, excepto durante el tiempo en el que el usuario se encuentre editando su valor.


Como primer paso, en el evento Load del formulario, además de asignar la cadena de máscara del modo anteriormente mencionado, estableceremos el cero como marcador mediante la propiedad PromptChar.


private void frmSalirFoco_Load(object sender, EventArgs e)
{
this.maskedTextBox1.Mask = “99999”;
this.maskedTextBox1.PromptChar = ‘0’;
}

Seguidamente pasaremos al momento en que el control recibe el foco, situación esta que podemos manipular mediante el evento Enter. Para facilitar la edición por parte del usuario, en el manipulador de este evento asignaremos el guión bajo ( _ ) como carácter marcador de posición, y eliminaremos los posibles espacios en blanco que pudiera tener el control, para así dejar solamente el valor real del número a editar.


private void maskedTextBox1_Enter(object sender, EventArgs e)
{
this.maskedTextBox1.PromptChar = ‘_’;
this.maskedTextBox1.Text = this.maskedTextBox1.Text.TrimStart();
}

Al concluir la edición y pasar el foco a otro control se producirá el evento Leave sobre el MaskedTextBox. En el manipulador de este evento reasignaremos a la propiedad Text del control el valor que actualmente tiene, pero aplicando a dicha propiedad el método PadLeft, para que la rellene con espacios en blanco. Como la longitud total de la cadena -incluyendo los espacios y el número- debe ser igual a la longitud de la máscara de entrada del control, pasaremos como parámetro a PadLeft la propiedad MaskedTextBox.Mask.Length; por lo que el control, como consecuencia de esta asignación, sustituirá los espacios en blanco por el marcador establecido en la propiedad PromptChar, que asignaremos en la siguiente línea de código. A continuación se muestra el código que debemos escribir en la clase del formulario para conseguir el resultado descrito mediante esta técnica.


private void maskedTextBox1_Leave(object sender, EventArgs e)
{
this.maskedTextBox1.Text = this.maskedTextBox1.Text.PadLeft(this.maskedTextBox1.Mask.Length);
this.maskedTextBox1.PromptChar = ‘0’;
}

En la siguiente figura podemos apreciar los distintos estados que va tomando el control: antes de su edición visualiza ceros; al entrar a editar, escribimos un número, mostrándose guiones bajos para aquellas posiciones no editadas; y al salir, en el caso de que no hayamos completado todos los dígitos posibles, se rellenarán con ceros a la izquierda aquellas posiciones vacías.



Los proyectos conteniendo el código de los ejemplos de las dos entregas del artículo están disponibles en los siguientes enlaces para C# y VB.


Espero que os sirva de ayuda.


Un saludo.


 

6 Comentarios

  1. anonymous

    Excelente el aporte gracias!!

  2. anonymous

    Sí me ha servido de mucho!! 😀 😀 😀

  3. lmblanco

    Hola yelinna

    Me alegra que te resultara de utilidad.

    Un saludo
    Luismi

  4. anonymous

    excelente aporte… me sirvio demasiado

  5. lmblanco

    Hola kmilonko

    Gracias por tu interés en el artículo. Celebro que te sirviera de ayuda.

    Un saludo,
    Luismi

  6. Santiago

    EXELENTE, me sirvio muchisimo, mis agradecimientos desde Argentina!

Leave a Reply

Tema creado por Anders Norén