1

我是一名 MFC 程序员,不熟悉 C#,正在寻找一个允许数字输入和范围验证的简单控件。

4

5 回答 5

8

查看“NumericUpDown”控件。它具有范围验证,输入将始终是数字,并且具有那些漂亮的增量/减量按钮。

于 2008-09-16T20:58:49.433 回答
1

我必须实现一个只接受数字、整数或实数的控件。我将控件构建为 TextBox 控件的特化(阅读:派生自),并使用输入控件和常规表达式进行验证。添加范围验证非常简单。

这是构建正则表达式的代码。_numericSeparation 是一个字符串,其字符接受为十进制逗号值(例如,“.”或“,”:$10.50 10,50€</p>

private string ComputeRegexPattern()
{
   StringBuilder builder = new StringBuilder();
   if (this._forcePositives)
   {
       builder.Append("([+]|[-])?");
   }
   builder.Append(@"[\d]*((");
   if (!this._useIntegers)
   {
       for (int i = 0; i < this._numericSeparator.Length; i++)
       {
           builder.Append("[").Append(this._numericSeparator[i]).Append("]");
           if ((this._numericSeparator.Length > 0) && (i != (this._numericSeparator.Length - 1)))
           {
               builder.Append("|");
           }
       }
   }
   builder.Append(@")[\d]*)?");
   return builder.ToString();
}

正则表达式匹配任何数字(即任何带有数字字符的字符串),只有一个字符作为数字分隔符,并且字符串开头有一个“+”或“-”可选字符。创建正则表达式后(实例化控件时),检查值是否正确覆盖 OnValidating 方法。CheckValidNumber() 只是将正则表达式应用于引入的文本。如果正则表达式匹配失败,则激活具有指定错误的错误提供程序(使用 ValidationError 公共属性设置)并引发 ValidationError 事件。在这里您可以进行验证以了解该号码是否在要求的范围内。

private bool CheckValidNumber()
{
   if (Regex.Match(this.Text, this.RegexPattern).Value != this.Text)
   {
       this._errorProvider.SetError(this, this.ValidationError);
       return false;
   }
   this._errorProvider.Clear();
   return true;
}

protected override void OnValidating(CancelEventArgs e)
{
   bool flag = this.CheckValidNumber();
   if (!flag)
   {
      e.Cancel = true;
      this.Text = "0";
   }
   base.OnValidating(e);
   if (!flag)
   {
      this.ValidationFail(this, EventArgs.Empty);
   }
}

正如我所说,我还阻止用户在文本框中输入数据,而不是覆盖 OnKeyPress 方法的数字字符:

protected override void OnKeyPress(KeyPressEventArgs e)
{
    if ((!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar)) && (!this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._numericSeparator.Contains(e.KeyChar.ToString())))
    {
        e.Handled = true;
    }
    if (this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._forcePositives)
    {
        e.Handled = true;
    }
    if (this._numericSeparator.Contains(e.KeyChar.ToString()) && this._useIntegers)
    {
        e.Handled = true;
    }
    base.OnKeyPress(e);
}

优雅的触感:每次用户释放按键时,我都会检查数字是否有效,以便用户在键入时获得反馈。(但请记住,您必须小心 ValidationFail 事件;))

protected override void OnKeyUp(KeyEventArgs e)
{
    this.CheckValidNumber();
    base.OnKeyUp(e);
}
于 2008-09-16T22:17:03.567 回答
0

您可以使用常规文本框和验证器控件来控制输入。

于 2008-09-16T20:59:02.960 回答
0

尝试使用错误提供程序控件来验证文本框。您可以使用 int.TryParse() 或 double.TryParse() 检查它是否为数字,然后验证范围。

于 2008-09-16T21:08:12.860 回答
0

您可以使用RequiredFieldValidator 和CompareValidator 的组合(设置为DataTypeCheck 运算符和类型设置为整数)

如果您愿意,可以使用普通文本框获得它,否则上面的建议很好。

于 2008-09-16T21:16:11.170 回答