这是我目前的代码:
private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && e.KeyChar != '.';
if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1) e.Handled = true;
}
答案 0 :(得分:6)
KeyPress不足以进行此类验证。绕过它的一种简单方法是使用Ctrl + V将文本粘贴到文本框中。或者上下文菜单,根本没有关键事件。
在这种特定情况下,TextChanged事件将完成工作:
private void textBox_TextChanged(object sender, EventArgs e) {
var box = (TextBox)sender;
if (box.Text.StartsWith(".")) box.Text = "";
}
但验证数值还有很多。您还需要拒绝诸如1.1.1或1.-2等内容。请改用Validating事件。在表单上删除ErrorProvider并实现如下事件:
private void textBox_Validating(object sender, CancelEventArgs e) {
var box = (TextBox)sender;
decimal value;
if (decimal.TryParse(box.Text, out value)) errorProvider1.SetError(box, "");
else {
e.Cancel = true;
box.SelectAll();
errorProvider1.SetError(box, "Invalid number");
}
}
答案 1 :(得分:0)
您可能希望使用TextChanged事件,因为用户可以粘贴值。为了获得满足要求的最佳体验,我建议您删除任何前导.
个字符。
void textBox1_TextChanged(object sender, EventArgs e)
{
if (textBox1.Text.StartsWith("."))
{
textBox1.Text = new string(textBox1.Text.SkipWhile(c => c == '.').ToArray());
}
}
这并未解决仅使用数字的要求 - 如果是这种情况,问题中并不清楚。
答案 2 :(得分:0)
这也适用于复制和粘贴。
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
int decimalCount=0;
string rebuildText="";
for(int i=0; i<textBox1.Text.Length; i++)
{
if (textBox1.Text[i] == '.')
{
if (i == 0) break;
if (decimalCount == 0)
rebuildText += textBox1.Text[i];
decimalCount++;
}
else if ("0123456789".Contains(textBox1.Text[i]))
rebuildText += textBox1.Text[i];
}
textBox1.Text = rebuildText;
textBox1.SelectionStart = textBox1.Text.Length;
}
答案 3 :(得分:0)
你可以试试这个:
private void TextBox_TextChanged(object sender, EventArgs e)
{
TextBox.Text = TextBox.Text.TrimStart('.');
}