Reputation: 1112
I have the following code:
private void txtNR_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar != '.'))
{
e.Handled = true;
}
else
{
}
// only allow one decimal point
if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1))
{
e.Handled = true;
}
else
{
MessageBox.Show("You cannot type letters!");
}
}
My question is: when I am trying to type letters the warning message is coming up front but the same is happening when i'm trying to type numbers, and after i click ok on message, the number is writtend down inside. Can you help me understand why?
Upvotes: 0
Views: 1746
Reputation: 6783
You don't say what your overall aim is.
However to correctly handle the event you are after this will work. You don't really want a pop up message all the time, better validate on form submission.
Are you trying to make a decimal text box ?
You've also got to take into account copy and paste which these events just aren't going to cover.
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar != '.'))
{
e.Handled = true;
}
else
{ // only allow one decimal point
if ((e.KeyChar == '.'))
{
if (((TextBox) sender).Text.Contains("."))
{
e.Handled = true;
}
}
else
{
if (char.IsControl(e.KeyChar))
{
return;
}
if (!char.IsDigit(e.KeyChar))
{
MessageBox.Show("You cannot type letters!");
}
}
}
Upvotes: 0
Reputation: 540
Your code should be like that:
if (!(char.IsControl(e.KeyChar) || char.IsDigit(e.KeyChar) || (e.KeyChar == '.')))
{
e.Handled = true;
MessageBox.Show("You cannot type letters!");
}
Upvotes: 1
Reputation: 48
I would suggest you to validate the content of the textbox after the user do his input ont it. Like @Sinatr said, for the user this could be an annoying thing to show a messagebox every time he writes wrong input.
It should also simplify your code, I think.
If the text is not numeric, then display the messagebox, something like that.
textbox_Validating(){
decimal d;
if(decimal.TryParse(textBox1.Text, out d))
{
//valid
}
else
{
//invalid
MessageBox.Show("Please enter a valid number");
return;
}
}
Something like that... Sorry for the eventual errors in the code. Good luck.
Upvotes: 0
Reputation: 129
Your condition is alright. You just need to set the Char to nothing
Try this:
// only allow one decimal point
if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1))
{
e.Handled = true;
}
else
{
MessageBox.Show("You cannot type letters!");
e.KeyChar = '\0';
}
Upvotes: 0
Reputation: 30688
Replace
else { }
with
else
Because of extra {}
the second if statement is executed even if first one is handled. Due to this you are seeing message box even if the character is digit (which is already handled)
Upvotes: 0