Algo que te va a venir bien es tener la posibilidad de disponer de un control TextBox en tu formulario que no permita otra entrada que no sean números.
Para ello vamos a disponer de una función (que incluirás en alguna de tus clases) que se encargará de controlar el carácter correspondiente a la pulsación recibida y devolverá el resultado si la pulsación recibida es un número o el separador decimal (si el TextBox va a admitir decimales).
El separador decimal es el establecido en la configuración de Windows.
El control de la pulsación del usuario vas a realizarlo a partir del evento KeyPress del TextBox
El código de la función:
/// <summary>
/// Establece si el carácter recibido es un número
/// o un separador decimal.
/// </summary>
/// <param name=”c“>Carácter recibido</param>
/// <param name=”AllowDecimals“>Establece si se admiten decimaes</param>
/// <param name=”cad“>Cadena de control para evitar más de un separador decimal
/// esta cadena correspondería con el contenido del textbox que se controla</param>
/// <returns></returns>
public static Boolean OnlyNumbers(string c, bool AllowDecimals, ref string cad)
{
string sep = CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
if (c == “.” || c == “,”)
{
c = sep;
if (AllowDecimals)
{
if (cad.IndexOf(sep) > -1)
{
return true;
}
else
{
cad += c;
return true;
}
}
else
{
return true;
}
}
if (c == “-“)
{
if (cad.Length > 0)
{
return true;
}
else
{
cad += c;
return true;
}
}
if (!char.IsControl(Convert.ToChar(c)) && !char.IsDigit(Convert.ToChar(c)))
{
return true;
}
return false;
}
Para poner a prueba la función, crea un formulario con un TextBox y con un CheckBox con el que podrás controlar si vas a admitir decimales o no.
El TextBox podría ser como el siguiente:
Agrega el siguiente código en el evento KeyPress del TextBox y CheckedChanged del CheckBox
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
bool AllowDecimals = this.checkBox1.Checked;
TextBox tb = sender as TextBox;
string antT = tb.Text;
string t = tb.Text;
e.Handled = OnlyNumbers(e.KeyChar.ToString(), AllowDecimals, ref t);
if (antT != t)
{
tb.Text = t;
tb.SelectionStart = tb.Text.Length;
}
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
CheckBox chkBx = sender as CheckBox;
if (!chkBx.Checked)
{
if (this.textBox1.Text.Contains(“.”))
{
this.textBox1.Text = this.textBox1.Text.Replace(“.”, “”);
}
else
{
if (this.textBox1.Text.Contains(“,”))
{
this.textBox1.Text = this.textBox1.Text.Replace(“,”, “”);
}
}
}
}
Verás que cuando pulses las teclas dentro del TextBox solo responderá si lo que recibe es un número o el separador decimal si es que va a admitirse (dependerá de cómo esté el CheckBox)
Ponlo a prueba, piensa en cómo mejorarlo y comparte con nosotros tus progresos.