[英]What is the best way to implement input restrictions on a TextBox in C#?
将TextBox
控件(或 .NET 3.5 标准的其他任何东西)的输入限制为浮点数的最优雅的方法是什么?
目前,我正在通过从TextBox
继承并覆盖OnKeyPress
来完成所有繁重的工作。 但是,我不禁想知道我是否在重新发明轮子。
如果您沿着建议的路线走 go,请不要忘记以下问题/极端情况:
SuppressKeyPress
,您将打破这一点)"-."
,因为他们开始输入"-.23"
)而您的文本框不会惩罚他们"-.1e-2"
这样的数字可以被认为是合法的float
的值道德? 执行您的建议可能非常棘手。
您可能想要执行以下组合:
TextChanged
事件中进行基本验证(并做一些被动的事情,比如更改文本框背景颜色)Parse
用户的价值看一下MaskedTextBox控件。 它还继承自 TextBoxBase 并且可能具有您正在构建的功能。
使用 NumericUpDown 怎么样?
我认为轮子还没有被发明出来(至少在 .NET 框架中)。 我敢肯定 CodeProject 或类似的东西有一些东西,做的和你一样,所以它可能值得谷歌。
不过,繁重的工作应该不会太糟糕。 它比乍一看要多一点。
过于简化的示例是您可以处理OnKeyPress
,执行Float.TryParse
并附加新字符。如果为真,请保持按键; 如果为假,则取消它( e.Handled = true
)。
困难的部分是如果他们删除、剪切或粘贴选择。 另一件事是当他们刚刚开始时(您可能希望接受“-”作为部分有效输入)......
或使用检查匹配
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
}
我发现了一个 maskedTextBox 的 ValidatingType 属性:
maskedTextBox1.ValidatingType = typeof(System.Double);
它确实告诉你它是否有效。 不幸的是,它似乎只验证焦点何时发生变化(即使这样它实际上也没有做任何事情); 但也许有一些方法可以使用它。
是否有必要在数据输入期间进行验证,或者一旦失去焦点,您是否可以检查输入的最终值?
如果是后者,您还可以使用ErrorProvider控件来帮助限制功能,直到输入被解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.