numeros - Cómo restringir el cuadro de texto en C#para que solo reciba números y(punto "." O coma ","), después de "." O "," solo permita 2 caracteres numéricos
textbox solo numeros c# (3)
Estoy tratando de desarrollar un código para restringir TextBox usando C # para permitir sólo la entrada de números + coma (",") o punto (".") + solo 2 números después de punto o coma Para ver números posibles que pueden ingresar:
3213,04 = OK
3211,664 = Not
32.31 = OK
32.3214 = Not
334,,00 = Not
3247,.00 = Not
214.,00 = Not
32.. = Not
8465,0 = Ok
654.0 = Ok
Entendido ¿Mi objetivo? Desarrollé el código abajo
private void txtValormetrocubico_KeyPress(object sender, KeyPressEventArgs e)
{
if (txtValormetrocubico.TextLength >= 0 && (e.KeyChar == (char)Keys.OemPeriod || e.KeyChar == (char)Keys.Oemcomma))
{
//tests
}
else
{
if (!char.IsControl(e.KeyChar)
&& !char.IsDigit(e.KeyChar)
&& e.KeyChar != ''.'' && e.KeyChar != '','')
{
e.Handled = true;
}
// only allow one decimal point
if (e.KeyChar == ''.'' && (sender as TextBox).Text.IndexOf(''.'') > -1)
{
e.Handled = true;
}
if (e.KeyChar == '','' && (sender as TextBox).Text.IndexOf('','') > -1)
{
e.Handled = true;
}
}
}
¡Prueba este código! Espero que esto ayude. Avíseme si puedo ayudarlo más.
Esta es la función auxiliar que he escrito
private bool alreadyExist(string _text , ref char KeyChar)
{
if (_text.IndexOf(''.'')>-1)
{
KeyChar = ''.'';
return true;
}
if (_text.IndexOf('','') > -1)
{
KeyChar = '','';
return true;
}
return false;
}
Este es el controlador de eventos de tu llave de prensa
private void txtValormetrocubico_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsControl(e.KeyChar)
&& !char.IsDigit(e.KeyChar)
&& e.KeyChar != ''.'' && e.KeyChar != '','')
{
e.Handled = true;
}
//check if ''.'' , '','' pressed
char sepratorChar=''s'';
if (e.KeyChar == ''.'' || e.KeyChar == '','')
{
// check if it''s in the beginning of text not accept
if (txtValormetrocubico.Text.Length == 0) e.Handled = true;
// check if it''s in the beginning of text not accept
if (txtValormetrocubico.SelectionStart== 0 ) e.Handled = true;
// check if there is already exist a ''.'' , '',''
if (alreadyExist(txtValormetrocubico.Text , ref sepratorChar)) e.Handled = true;
//check if ''.'' or '','' is in middle of a number and after it is not a number greater than 99
if (txtValormetrocubico.SelectionStart != txtValormetrocubico.Text.Length && e.Handled ==false)
{
// ''.'' or '','' is in the middle
string AfterDotString = txtValormetrocubico.Text.Substring(txtValormetrocubico.SelectionStart);
if (AfterDotString.Length> 2)
{
e.Handled = true;
}
}
}
//check if a number pressed
if (Char.IsDigit(e.KeyChar))
{
//check if a coma or dot exist
if (alreadyExist(txtValormetrocubico.Text ,ref sepratorChar))
{
int sepratorPosition = txtValormetrocubico.Text.IndexOf(sepratorChar);
string afterSepratorString = txtValormetrocubico.Text.Substring(sepratorPosition + 1 );
if (txtValormetrocubico.SelectionStart > sepratorPosition && afterSepratorString.Length >1)
{
e.Handled = true;
}
}
}
}
Creo que necesitas algo como control de Masked Textbox aquí tienes algunas referencias
http://msdn.microsoft.com/en-us/library/kkx4h3az.aspx http://www.c-sharpcorner.com/uploadfile/mahesh/maskedtextbox-in-C-Sharp/
Otra forma de hacer lo que quiere es usar expresiones regulares
Bueno, puede crear una función general y llamarlo al evento de keypress
de keypress
este código es una instancia general.
validate_textBox
es una función general
private void validate_textBox(TextBox _text, KeyPressEventArgs e)
{
if (!char.IsControl(e.KeyChar)
&& !char.IsDigit(e.KeyChar)
&& e.KeyChar != ''.'' && e.KeyChar != '','')
{
e.Handled = true;
}
if (!char.IsControl(e.KeyChar)
&& !char.IsDigit(e.KeyChar)
&& e.KeyChar != ''.'' && e.KeyChar != '','')
{
e.Handled = true;
}
//check if ''.'' , '','' pressed
char sepratorChar = ''s'';
if (e.KeyChar == ''.'' || e.KeyChar == '','')
{
// check if it''s in the beginning of text not accept
if (_text.Text.Length == 0) e.Handled = true;
// check if it''s in the beginning of text not accept
if (_text.SelectionStart == 0) e.Handled = true;
// check if there is already exist a ''.'' , '',''
if (alreadyExist(_text.Text, ref sepratorChar)) e.Handled = true;
//check if ''.'' or '','' is in middle of a number and after it is not a number greater than 99
if (_text.SelectionStart != _text.Text.Length && e.Handled == false)
{
// ''.'' or '','' is in the middle
string AfterDotString = _text.Text.Substring(_text.SelectionStart);
if (AfterDotString.Length > 2)
{
e.Handled = true;
}
}
}
//check if a number pressed
if (Char.IsDigit(e.KeyChar))
{
//check if a coma or dot exist
if (alreadyExist(_text.Text, ref sepratorChar))
{
int sepratorPosition = _text.Text.IndexOf(sepratorChar);
string afterSepratorString = _text.Text.Substring(sepratorPosition + 1);
if (_text.SelectionStart > sepratorPosition && afterSepratorString.Length > 1)
{
e.Handled = true;
}
}
}
}
Luego puede llamar a la función como este código para cada cuadro de texto que tenga en la forma
private void txtValormetrocubico_KeyPress(object sender, KeyPressEventArgs e)
{
validate_textBox(sender as TextBox, e);
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
validate_textBox(sender as TextBox, e);
}