对于我的计划,输入员工信息 - 如身份证,姓名,年薪和年薪。我制作了ID和工资箱numericupdown,但我想让工资箱成为一个只接受数字的文本框。
然而,当我尝试从numericupdown更改为文本框时,出现错误,说“无法隐式转换”字符串“到”十进制“。我还有另一个按钮,找到最低工资等但问题是什么?我想要创建例外以使文本框只接受数字,但它不会让我:/
答案 0 :(得分:9)
如何在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链接解释了如何处理小数点等事项。
答案 1 :(得分:4)
然而,当我尝试从numericupdown更改为文本框时,发生错误,说“无法将字符串”隐式转换为“十进制”。
这对我来说就像是一个投射错误。
employee.EmployeeId = (int)idNumericUpDown.Value;
请改为尝试:
employee.EmployeeId = decimal.Parse(idNumericUpDown.Value);
并查看TryParse
,它更清晰。
答案 2 :(得分:1)
这就是我一直为我的文本框做的事情。
功能(允许所有数值和退格键):
private bool NumericOnly(char e)
{
return (e > (char)47 & e < (char)58) | e == (char)8;
}
和文本框的onkeypress事件:
if (!NumericOnly(e.KeyChar)) e.Handled = true;
答案 3 :(得分:1)
我找到了一个 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);
}
其他方式 - create numeric text box,或使用解析和验证:
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控件输入数字,因为它告诉用户“看到这个箭头?我在这里仅输入数字!”。而textbox对它接受的文本格式一无所知。
答案 4 :(得分:1)
您可以创建一个“蒙面”文本框,只允许在添加到现有文本时匹配正则表达式的字符。
缺点:
首先,开发一个正是你的“编辑掩码”的正则表达式。对于数字,它可以像^\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);
}
就像Robert Harvey的回答一样,这种方法将“吞下”任何按键,当附加到文本框的当前文本值时,与正则表达式不匹配。您可以将此MaskedTextBox用于数字条目,但不仅适用于需要仅限alpha值的文本框,仅限字母数字(无符号或空格),有效的本地或网络路径,IP地址等。