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

时间:2009-03-05 22:57:51

标签: c# winforms

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

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

7 个答案:

答案 0 :(得分:13)

如果您沿着建议的路线前进,请不要忘记以下问题/角落:

  • 用户可以使用 Ctrl - V Shift - 插入来粘贴“无效”值(第二个是有点棘手的问题... ...但是可能应该允许用户将合法值粘贴到控件中
  • 用户可以右键单击,使用默认上下文菜单
  • 粘贴无效值
  • 即使您尝试通过为文本框提供自己的上下文菜单来修复上一个问题,用户也可以右键单击控件外部,按住右键,拖动文本框,然后放开访问默认上下文-menu(并粘贴无效值)
  • 无论你做什么关键处理,都不应该禁用 Alt - F4 等组合键。(是的,如果你设置{{1},你会打破这个}对于所有不是有效数字的东西)
  • 用户应该可以输入部分值(例如SuppressKeyPress,因为他们开始输入"-."),而文本框不会惩罚他们
  • "-.23"之类的数字可视为合法
  • 用户可以输入一个只包含数字的值,但会溢出"-.1e-2"
  • 最糟糕的一个:您的用户在发货后会发现的其他神秘角落案例(!!)

道德?做你想要的事情可能会非常棘手。

您可能想要组合以下内容:

  • 使用一个知道所有角落案例的人(如微软)
  • 的控件
  • float事件中进行基本验证(并执行被动操作,例如更改文本框背景颜色)
  • 保存验证,直到您实际尝试使用他们在
  • 中输入的值
  • 使用系统库TextChanged用户的价值

答案 1 :(得分:2)

查看MaskedTextBox控件。它还继承自TextBoxBase,并且可能具有您构建的功能。

答案 2 :(得分:1)

使用NumericUpDown怎么样?

答案 3 :(得分:0)

我认为车轮尚未发明(至少在.NET框架中)。我确信在CodeProject之类的东西上有类似于你的东西,所以它可能值得谷歌。

尽管如此,举重不应该太糟糕。乍一看还有一点点。

过于简化的示例是您可以处理OnKeyPress,使用附加的新字符执行Float.TryParse。如果为true,请保持按键;如果为false,则取消它(e.Handled = true)。

如果他们删除,剪切或粘贴选择,那么困难的部分就是这样。另一件事是当他们刚开始时(你可能想接受“ - ”作为部分有效输入)......

答案 4 :(得分:0)

或使用

检查匹配
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
}

答案 5 :(得分:0)

我发现了maskedTextBox的ValidatingType属性:

maskedTextBox1.ValidatingType = typeof(System.Double);

确实告诉你它是否有效。不幸的是,它似乎只是在焦点变化时进行验证(即使那时它实际上没有做任何事情);但也许有一些方法可以使用它。

答案 6 :(得分:0)

是否有必要在数据输入期间进行验证,或者您是否能够在焦点丢失后检查输入的最终值?

如果是后者,您还可以使用ErrorProvider控件来帮助限制功能,直到输入得到解决。