寻找一个简单的C#数字编辑控件
我是一位刚接触Cand的MFC程序员,正在寻找一种简单的控件来允许数字输入和范围验证。
解决方案
回答
查看" NumericUpDown"控件。它具有范围验证,输入将始终是数字,并且具有那些漂亮的递增/递减按钮。
回答
我们可以使用常规文本框和Validator控件来控制输入。
回答
尝试使用错误提供程序控件来验证文本框。我们可以使用int.TryParse()或者double.TryParse()来检查其是否为数字,然后验证范围。
回答
我们可以使用RequiredFieldValidator和CompareValidator的组合(将运算符设置为DataTypeCheck并将Type设置为Integer)
如果愿意,可以使用普通的文本框来获得它,否则上面的建议是不错的选择。
回答
我必须实现一个仅接受数字,整数或者实数的控件。
我将控件构建为TextBox控件的特化(读取:从中派生),并使用输入控件和常规expresin进行验证。
添加范围验证非常容易。
这是用于构建正则表达式的代码。 _numericSeparation是一个字符串,其字符被接受为十进制逗号值
(例如,"。"或者",":¥ 10.50 10,50
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(); }
正则表达式匹配仅以一个字符作为数字分隔符的任何数字(即,具有数字字符的任何字符串),并且在字符串的开头使用" +"或者"-"可选字符。
一旦创建了正则表达式(当实例化Control时),我们将检查覆盖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); }