如何最优雅地限制TextBox
控件(或任何其他标准.NET 3.5控件)的输入为浮点数?
目前,我通过继承TextBox
并覆盖OnKeyPress
方法来完成所有繁重的工作。但是,我不禁想知道是否有更好的方法。
如果您按照您提议的路线前进,不要忘记以下问题/边角情况:
SuppressKeyPress
,那么是的,您将打破它)。"-."
,当他们开始输入 "-.23"
时),而不会受到您的文本框的惩罚。"-.1e-2"
这样的数字可能是合法的。float
的值。故事?做你建议的事情可能非常棘手。
您可能希望进行以下组合:
TextChanged
事件中进行基本验证(并执行某些被动操作,例如更改文本框背景色)。解析
用户的值。请看MaskedTextBox控件。它也继承自TextBoxBase,可能具有您正在构建的功能。
使用NumericUpDown怎么样?
或者使用检查匹配
void TextBox_KeyUp(object sender, KeyEventArgs e)
{
if(..) // your condition
{
e.SuppressKeyPress = false;
}
else
{
e.SuppressKeyPress = true;
}
}
或者
void TextBox_KeyUp(object sender, KeyEventArgs e)
{
e.SuppressKeyPress = CheckInput(e.KeyValue); // where CheckInput is boolean method
}
maskedTextBox1.ValidatingType = typeof(System.Double);
它确实会告诉你它是否有效。不幸的是,它似乎只在焦点改变时进行验证(即使那样它实际上并没有做任何事情);但也许有一些方法可以利用它。
我认为该功能尚未被发明(至少在.NET框架中)。但我确定CodeProject或类似网站上有类似的东西,这可能值得一试。
不过,这项工作并不是特别困难。只是看起来需要多花一点功夫。
一个过于简单的例子是你可以处理OnKeyPress
,并用新字符附加进行Float.TryParse
。如果返回true,则保留键盘输入;如果返回false,则取消它(e.Handled = true
)。
困难的部分是,如果用户删除、剪切或粘贴选定内容会怎样。另外一件事情是当他们刚开始时(你可能希望接受“-”作为部分有效输入)...
在数据输入期间进行验证是必要的吗?还是可以在焦点失去后检查输入的最终值?
如果是后者,您还可以使用ErrorProvider控件来帮助限制功能,直到输入得到解决。