TextBox que solo acepta números enteros o de punto flotante [¿Aporte?]

Iniciado por Xavelets, 21 Septiembre 2011, 05:47 AM

0 Miembros y 1 Visitante están viendo este tema.

Xavelets

Hola a todos!!

Estoy realizando un pequeño proyecto en el cual tenia la necesidad de un textbox que solo aceptara número enteros o de punto flotante (positivos);  investigando mucho en la red, encontré algunos snipets y varias ideas, y con dicho material confeccione una pequeña clase derivada del textbox que realiza lo que describo.

La pongo a su consideración con la esperanza de que le sea útil a alguien más y que con sus opiniones y aportes mejorar el código y las funcionalidades.
Les advierto que soy principiante en C# y .Net

Sin mas, pongo el código:

[Editado] (Trabajar cansado y apresurarse a publicar no deja nada bueno  ;) )
Código (csharp) [Seleccionar]

    public class NumTextBox : TextBox
    {
        private bool aceptapunto = true;
        private delegate bool Delegado(char E);
        Delegado analizaKeychar;

        public NumTextBox()
        {
            analizaKeychar = conPunto;
        }

        [Category("Comportamiento")]
        public bool AceptaPunto
        {
            set
            {
                aceptapunto = value;
                if (aceptapunto)
                    analizaKeychar = conPunto;
                else
                    analizaKeychar = sinPunto;
            }
            get { return aceptapunto; }
        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);
            if (!analizaKeychar(e.KeyChar))
            {
                e.Handled = true;
            }
            if (base.Text.Contains(".") && (e.KeyChar == '.') && aceptapunto)
            {
                e.Handled = true;
            }
        }

        protected override void OnLeave(System.EventArgs e)
        {
            base.OnLeave(e);
            if (aceptapunto)
            {
                if (base.Text.StartsWith("."))
                {
                    base.Text = base.Text.Insert(0, "0");
                }
            }
        }

        private bool conPunto(char E)
        {
            return (char.IsDigit(E) || char.IsControl(E) || E == '.');
        }

        private bool sinPunto(char E)
        {
            return (char.IsDigit(E) || char.IsControl(E));
        }
    }


Como pueden ver el código es muy básico (de principiante  :-[  :rolleyes:) espero me ayuden a mejorarlo y hacerlo más profesional.

Se que es extremadamente ineficiente que con cada caracter recibido asigne el método al delegado, pero no encontré otra forma si quería que el control pudiese ser arrastrado desde la barra de herramientas del visual studio, ya que al asignar un parámetro al constructor, me era imposible arrastrar dicho control. Por otra parte tampoco he encontrado la manera que la propiedad "AceptPunto" definida por mi, sea visible en la barra de propiedades del VS.

En mi pais el separador de decimales es el ".", por lo que para utilizar  el caracter "," solo deben cambiarlo en donde encuentren el "."

En un par de días prometo explicar y documentar dicho código

Salu2
"Llegará un día en que un hombre te hablará a miles de kilómetros de distancia, y tu tranquilamente le podrás escuchar donde estés, más no le podrás ver por estar tan lejos." Quinta profecía Maya.

neoncyber

si quieres hacer las validaciones de forma profesional, y bueno en el caso que estes utilizando winforms ... deberias ver algo sobre maskedtextbox, ademas las validaciones podrias hacerlas con expresiones regulares.

Saludos
Código (python) [Seleccionar]

#!/usr/bin/python
print "Visit:"
print "http:\\donkeysharp.blogspot.com"

Keyen Night

Cita de: neoncyber en 21 Septiembre 2011, 15:55 PM
si quieres hacer las validaciones de forma profesional, y bueno en el caso que estes utilizando winforms ... deberias ver algo sobre maskedtextbox, ademas las validaciones podrias hacerlas con expresiones regulares.

Saludos

+1
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

Xavelets

Hola neoncyber!!

Te agradezco mucho tu sugerencia, de hecho inicialmente si intenté el uso de  maskedtextbox, sin embargo debido a mi inexperiencia, me tope con algunos problemas que no pude superar, el primero es que debido a que estoy probando un algoritmo que hace operaciones con números muuuuy grandes y queria poder ver todos los dígitos introducidos necesitaba la propiedad "multiline" la cual no encontré en el maskedtextbox, por otra parte, me vi restringido a introducir únicamente los dígitos que definian el Mask  (nunca se me ocurrió intentar usar una expresion regular como máscara   :rolleyes: >:D) de ahí que estuve buscando como resolver esos problemas, y como resultado.... la clase anterior

Sin contar que fue un buen ejercicio de programación en C# para mi jejejeje ;D

Salu2
"Llegará un día en que un hombre te hablará a miles de kilómetros de distancia, y tu tranquilamente le podrás escuchar donde estés, más no le podrás ver por estar tan lejos." Quinta profecía Maya.