Vargas Software Development

Software is just a story about winners and glory and you know that it’s true

TextBox Numérico

En respuesta a Ander y a sus dos últimos post:
.NET: Validar que introducimos números enteros en un TextBox
.NET: Validar que introducimos números enteros en un TextBox (2ª parte), o como usar int.TryParse

Voy a publicar cómo crear un TextBox numérico y validar correctamente el contenido de este:


public class NumericTextBox : TextBox
{
    protected override bool ProcessDialogKey(Keys keyData)
    {
        if ((keyData.CompareTo(Keys.D0) >= 0 && keyData.CompareTo(Keys.D9) <= 0)
            || (keyData.CompareTo(Keys.NumPad0) >= 0 && keyData.CompareTo(Keys.NumPad9) <= 0)
            || keyData.Equals(Keys.Tab)
            || keyData.Equals(Keys.Return)
            || keyData.Equals(Keys.Enter)
            || keyData.Equals(Keys.Delete)
            || keyData.Equals(Keys.Back)
            || keyData.Equals(Keys.Control | Keys.V)
            || keyData.Equals(Keys.Control | Keys.X)
            || keyData.Equals(Keys.Control | Keys.C)
            //Por si permitimos nÃ���Ã��Ã�ºmeros negativos.
            || ((keyData.Equals(Keys.Subtract)
                || keyData.Equals(Keys.OemMinus))
                && Text.IndexOf('-') < 0
                && SelectionStart == 0)
            )
            return base.ProcessDialogKey(keyData);
        else
            return true;
    }

    protected override void OnValidating(System.ComponentModel.CancelEventArgs e)
    {
        Text = Text.Trim();
        //Validamos con una expresiÃ���Ã��Ã�³n regular.
        Regex r = new Regex(@"(-)?(\\d)+");
        e.Cancel = !r.Match(Text).Success;
        base.OnValidating(e);
    }
}

Lo que hacemos es heredar de la clase TextBox y sobreescribir dos métodos claves: ProcessDialogKey y OnValidating. El primero nos permite filtrar las teclas (o combinación) que van a ser aceptadas por el TextBox y el segundo nos permitirá asegurar la validación.

Filed under: Windows Forms

5 Responses - Comments are closed.

  1. Rafa Vargas says:

    La expresión regular es así:
    Regex r = new Regex(@”(-)?(\d)+”);

    Pero sale mal en el post… :S el [sourcecode] de WordPress tiene mucho que mejorar…

  2. Ander says:

    Si, es una muy buena opción ;)
    La camiseta te la estas ganando con crecez jiji.

  3. Miguel Ángel says:

    ¿Por qué no puedo cerrar un formulario con un cuadro de texto numérico sin haber introducido nada en el mismo?

    Un saludo.

  4. Vargas says:

    Pues porque se espera que escribas un número en él. Como solución a tu problema podrías hacer lo siguiente: si no se ha escrito nada, en la validación insertarás un 0. En cualquier otro caso, también puedes modificar la expresión regular.

    Un saludo.

  5. Miguel Ángel says:

    De acuerdo. Lo he solucionado comprobando si se ha introducido o no datos, es decir, si Text.Length > 0 realizo la validación mediante la expresión regular y si no directamente ejecuto la instrucción base.OnValidating(e);

    Muchas gracias y feliz año!

Archives

About me

My name is Rafa Vargas. I'm an undergraduate student of Computer Science at University of Seville, Spain. I am mainly interested in computer security, usability and the business of software.

Click here to read the full story.

Recently on twitter