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 ;) )
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
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
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
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