只允许输入数字的文本框而不是C#中的NumericUpDown

时间:2012-04-18 15:08:52

标签: c# string decimal

对于我的计划,输入员工信息 - 如身份证,姓名,年薪和年薪。我制作了ID和工资箱numericupdown,但我想让工资箱成为一个只接受数字的文本框。

然而,当我尝试从numericupdown更改为文本框时,出现错误,说“无法隐式转换”字符串“到”十进制“。我还有另一个按钮,找到最低工资等但问题是什么?我想要创建例外以使文本框只接受数字,但它不会让我:/

5 个答案:

答案 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,或使用解析和验证:

  1. ErrorProvider组件从ToolBox拖到表单中。
  2. 为文本框设置CausesValidation属性为true(默认情况下为真)。
  3. 创建NumericTextBox_Validating事件处理程序并将其订阅到所有应包含小数值的文本框。
  4. 如果无法从文本框中的文本解析十进制值,则会在文本框附近显示错误符号,并显示消息“仅允许数值”。

    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地址等。