繁体   English   中英

在 C# 中对 TextBox 实施输入限制的最佳方法是什么?

[英]What is the best way to implement input restrictions on a TextBox in C#?

TextBox控件(或 .NET 3.5 标准的其他任何东西)的输入限制为浮点数的最优雅的方法是什么?

目前,我正在通过从TextBox继承并覆盖OnKeyPress来完成所有繁重的工作。 但是,我不禁想知道我是否在重新发明轮子。

如果您沿着建议的路线走 go,请不要忘记以下问题/极端情况:

  • 用户可以使用Ctrl - VShift - Insert将“无效”值粘贴到其中(第二个有点难以捕捉)......但用户可能应该被允许将合法值粘贴到控件中
  • 用户可以右键单击,使用默认上下文菜单粘贴无效值
  • 即使您尝试通过为文本框提供自己的上下文菜单来解决上一个问题,用户也可以在您的控件之外右键单击,按住右键,拖动您的文本框并让 go 访问默认的上下文菜单(并粘贴无效值)
  • 无论您做什么键处理都不应该禁用诸如Alt - F4等键组合(是的,如果您为所有不是有效数字的内容设置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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM