我想创建一个 TextChanged 事件来检查输入文本是否符合特定条件,如果不符合则删除最后输入的字符。在本例中,标准是数字、1 位小数和 1 位分数。
我正在测试仅用于数字和小数的正则表达式,并遇到了问题。我尝试了几种不同的表达式(我不擅长编写自己的表达式,因此它们是从各种其他堆栈溢出问题中选取的),并且每次的结果都是相同的。它可以很好地接受数字,但不接受小数。任何帮助将不胜感激!
string isNumber = @"^\d{1,9}(\.\d{1,9})?$";
private void TextBox_TextChanged(object sender, EventArgs e)
{
TextBox text = (TextBox)sender;
Match match = Regex.Match(text.Text, isNumber);
if (!match.Success)
{
if (text.Text.Length > 1)
text.Text = text.Text.Substring(0, text.Text.Length - 1);
else
text.Text = "";
text.Select(text.Text.Length, 0); //set cursor to the end
//of the string
}
}
我认为问题在于您试图在用户输入时逐个字符地验证数字,但如果该值不是无效值,则不可能输入有效的十进制数字暂时地.
考虑当用户键入值时会发生什么1.2
:
- 用户输入字符
1
.
- 由于文本框的值发生更改,因此会触发验证。
-
1
是有效的小数,因此验证通过。
- 用户继续输入,添加小数点字符
.
- 由于文本框的值发生更改,验证再次触发。
-
1.
根据正则表达式,这不是有效的小数,因此最后一个字符被删除。
- 文本框的值现在又回到了
1
.
- 用户会感到沮丧。转到步骤 4。
如您所见,无法输入小数点。但是,如果您尝试更改正则表达式以允许存在小数点而没有后续数字,那么如果用户在键入小数点后停止然后提交表单,则可能会得到无效值。
所以重点是,使用逐个字符的验证方案不适用于小数。更好的方法是允许用户在框中输入他们想要的任何内容,然后在用户完成输入后进行验证。您可以通过验证文本框何时失去焦点或何时提交表单来完成此操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)