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 )
Como pueden ver el código es muy básico (de principiante ) 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
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 ) 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