elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  TextBox que solo acepta números enteros o de punto flotante [¿Aporte?]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: TextBox que solo acepta números enteros o de punto flotante [¿Aporte?]  (Leído 6,531 veces)
Xavelets

Desconectado Desconectado

Mensajes: 12



Ver Perfil
TextBox que solo acepta números enteros o de punto flotante [¿Aporte?]
« en: 21 Septiembre 2011, 05:47 am »

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
  1.    public class NumTextBox : TextBox
  2.    {
  3.        private bool aceptapunto = true;
  4.        private delegate bool Delegado(char E);
  5.        Delegado analizaKeychar;
  6.  
  7.        public NumTextBox()
  8.        {
  9.            analizaKeychar = conPunto;
  10.        }
  11.  
  12.        [Category("Comportamiento")]
  13.        public bool AceptaPunto
  14.        {
  15.            set
  16.            {
  17.                aceptapunto = value;
  18.                if (aceptapunto)
  19.                    analizaKeychar = conPunto;
  20.                else
  21.                    analizaKeychar = sinPunto;
  22.            }
  23.            get { return aceptapunto; }
  24.        }
  25.  
  26.        protected override void OnKeyPress(KeyPressEventArgs e)
  27.        {
  28.            base.OnKeyPress(e);
  29.            if (!analizaKeychar(e.KeyChar))
  30.            {
  31.                e.Handled = true;
  32.            }
  33.            if (base.Text.Contains(".") && (e.KeyChar == '.') && aceptapunto)
  34.            {
  35.                e.Handled = true;
  36.            }
  37.        }
  38.  
  39.        protected override void OnLeave(System.EventArgs e)
  40.        {
  41.            base.OnLeave(e);
  42.            if (aceptapunto)
  43.            {
  44.                if (base.Text.StartsWith("."))
  45.                {
  46.                    base.Text = base.Text.Insert(0, "0");
  47.                }
  48.            }
  49.        }
  50.  
  51.        private bool conPunto(char E)
  52.        {
  53.            return (char.IsDigit(E) || char.IsControl(E) || E == '.');
  54.        }
  55.  
  56.        private bool sinPunto(char E)
  57.        {
  58.            return (char.IsDigit(E) || char.IsControl(E));
  59.        }
  60.    }
  61.  

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


« Última modificación: 9 Octubre 2011, 05:53 am por Xavelets » En línea

“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

Desconectado Desconectado

Mensajes: 90



Ver Perfil WWW
Re: TextBox que solo acepta números enteros o de punto flotante [¿Aporte?]
« Respuesta #1 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


En línea

Código
  1. #!/usr/bin/python
  2. print "Visit:"
  3. print "http:\\donkeysharp.blogspot.com"
  4.  
Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: TextBox que solo acepta números enteros o de punto flotante [¿Aporte?]
« Respuesta #2 en: 21 Septiembre 2011, 18:02 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
En línea

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

Desconectado Desconectado

Mensajes: 12



Ver Perfil
Re: TextBox que solo acepta números enteros o de punto flotante [¿Aporte?]
« Respuesta #3 en: 21 Septiembre 2011, 23:38 pm »

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
En línea

“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.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines