我需要一个只有用户可以输入整数的文本框。但是用户不能输入零。即,他可以输入10,100等。不仅仅是0。 如何在KeyDown中创建活动?
答案 0 :(得分:9)
您计划这样做的方式对用户来说非常烦人。你猜测用户想要输入什么,并按照你的猜测行事,但你可能会错。
它也有漏洞,例如,用户可以输入“10”然后删除“1”。或者他可以粘贴“0” - 你允许粘贴,不是吗?
所以我的解决方案是:让他输入他喜欢的任何数字,他喜欢的任何方式,并在完成之后仅验证输入,例如,当输入失去焦点时。
答案 1 :(得分:6)
为什么不使用NumericUpDown并进行以下设置:
upDown.Minimum = 1;
upDown.Maximum = Decimal.MaxValue;
答案 2 :(得分:3)
使用int.TryParse将文本转换为数字并检查该数字是否为0.使用Validating事件进行检查。
// this goes to you init routine
textBox1.Validating += textBox1_Validating;
// the validation method
private void textBox1_Validating(object sender, CancelEventArgs e)
{
if (textBox1.Text.Length > 0)
{
int result;
if (int.TryParse(textBox1.Text, out result))
{
// number is 0?
e.Cancel = result == 0;
}
else
{
// not a number at all
e.Cancel = true;
}
}
}
修改强>
好的,既然你使用WPF,你应该看一下如何实现validation the WPF way。这是一个实现上述逻辑的验证类:
public class StringNotZeroRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (textBox1.Text.Length == 0)
return new ValidationResult(true, null);
int result;
if (int.TryParse(textBox1.Text, out result))
{
// number is 0?
if (result == 0)
{
return new ValidationResult(false, "0 is not allowed");
}
}
else
{
// not a number at all
return new ValidationResult(false, "not a number");
}
return new ValidationResult(true, null);
}
}
答案 3 :(得分:1)
这是主题的另一个变体:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
char newChar = Convert.ToChar(e.KeyValue);
if (char.IsControl(newChar))
{
return;
}
int value;
e.SuppressKeyPress = int.TryParse((sender as TextBox).Text + newChar.ToString(), out value) ? value == 0 : true;
}
答案 4 :(得分:0)
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (textBox1.Text == "" && e.KeyChar == '0')
{
e.Handled = true;
return;
}
if (e.KeyChar < '0' || e.KeyChar > '9')
{
e.Handled = true;
return;
}
}
不好但是有效