对于我的程序,输入员工信息 - 例如 ID、姓名、姓氏和年薪。我将 ID 和薪水框设为 numericupdown,但我想将薪水框设为仅包含数字的文本框。
但是,当我尝试从 numericupdown 更改为文本框时,会出现错误,提示“无法将“字符串”隐式转换为“十进制”。我还有另一个按钮可以找到最低工资等,但问题是什么?我想创建异常使文本框只接受数字,但它不会让我:/
如何在 C# 中创建数字文本框
http://msdn.microsoft.com/en-us/library/ms229644(v=vs.90).aspx
最简单的形式:
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar))
{
e.Handled = true;
}
}
这段代码只会吞下任何不是数字的击键。MSDN 链接解释了如何处理小数点等内容。
但是,当我尝试从 numericupdown 更改为文本框时,会出现错误,提示“无法将“字符串”隐式转换为“十进制”。
在我看来,这就像一个铸造错误。
employee.EmployeeId = (int)idNumericUpDown.Value;
试试这个:
employee.EmployeeId = decimal.Parse(idNumericUpDown.Value);
并查看TryParse
更清洁的 。
这就是我一直为我的文本框做的事情。
功能(允许所有数值和退格键):
private bool NumericOnly(char e)
{
return (e > (char)47 & e < (char)58) | e == (char)8;
}
和文本框的 onkeypress 事件:
if (!NumericOnly(e.KeyChar)) e.Handled = true;
这是我发现的一个hack 。您可以这样隐藏 NumericUpDown 控件的箭头:
private void RemoveArrows(NumericUpDown numericUpDown)
{
Control updown = numericUpDown.Controls[0];
updown.Left += updown.Width;
updown.Visible = false;
}
只需为您的 NumericUpDown 控件调用此方法(例如在 Form_Load 事件处理程序上):
private void Form2_Load(object sender, EventArgs e)
{
RemoveArrows(idNumericUpDown);
RemoveArrows(salaryNumericUpDown);
}
其他方式 -创建数字文本框,或使用解析和验证:
ErrorProvider
组件从 ToolBox 拖到表单中。CausesValidation
属性true
(默认为真)。如果无法从文本框中的文本解析十进制值,则会在文本框附近显示错误符号,并显示消息“仅允许数值”。
private void NumericTextBox_Validating(object sender, CancelEventArgs e)
{
TextBox textBox = sender as TextBox;
decimal value;
if (Decimal.TryParse(textBox.Text, out value))
{
errorProvider1.SetError(textBox, "");
return;
}
e.Cancel = true;
errorProvider1.SetError(textBox, "Only numeric values allowed");
}
建议- 使用 NumericUpDown 控件输入数字,因为它告诉用户“看到这个箭头了吗?我在这里只输入数字!” . 并且文本框没有说明它接受的文本格式。
您可以创建一个“掩码”文本框,该文本框仅允许添加到现有文本时与正则表达式匹配的字符。
它的短处:
首先,开发一个作为您的“编辑掩码”的正则表达式。对于数字,它可以像^\d*$
(任意长度的整数)一样简单,也可以像^(\d{1,3}(,?\d\d\d)*(.\d{1,})?)?$
(带有可选逗号和可选小数部分的数字)一样复杂。将此分配给派生自 TextBox 的新控件的公共属性。
然后,在派生的文本框中覆盖 OnKeyPress,使其看起来像这样:
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (!Regex.Match(new StringBuilder(Text).Append(e.KeyChar).ToString(), MaskPattern))
{
e.Handled = true;
}
else
base.OnKeyPress(e);
}
就像罗伯特哈维的回答一样,这种方法将“吞下”任何按键,当附加到文本框的当前文本值时,与正则表达式不匹配。您不仅可以将此 MaskedTextBox 用于数字条目,还可以用于需要纯字母值、纯字母数字(无符号或空格)、有效本地或网络路径、IP 地址等的文本框。