2

对于我的程序,输入员工信息 - 例如 ID、姓名、姓氏和年薪。我将 ID 和薪水框设为 numericupdown,但我想将薪水框设为仅包含数字的文本框。

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

4

5 回答 5

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 链接解释了如何处理小数点等内容。

于 2012-04-18T15:10:24.707 回答
4

但是,当我尝试从 numericupdown 更改为文本框时,会出现错误,提示“无法将“字符串”隐式转换为“十进制”。

在我看来,这就像一个铸造错误。

    employee.EmployeeId = (int)idNumericUpDown.Value;

试试这个:

    employee.EmployeeId = decimal.Parse(idNumericUpDown.Value);

并查看TryParse更清洁的 。

于 2012-04-18T15:12:01.823 回答
1

这就是我一直为我的文本框做的事情。

功能(允许所有数值和退格键):

private bool NumericOnly(char e)
        {
            return (e > (char)47 & e < (char)58) | e == (char)8;
        }

和文本框的 onkeypress 事件:

if (!NumericOnly(e.KeyChar)) e.Handled = true;
于 2012-04-18T15:14:02.693 回答
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);
}

其他方式 -创建数字文本框,或使用解析和验证:

  1. ErrorProvider组件从 ToolBox 拖到表单中。
  2. 为文本框设置CausesValidation属性true(默认为真)。
  3. 创建 NumericTextBox_Validating 事件处理程序并将其订阅到所有应该包含十进制值的文本框。

如果无法从文本框中的文本解析十进制值,则会在文本框附近显示错误符号,并显示消息“仅允许数值”。

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 控件输入数字,因为它告诉用户“看到这个箭头了吗?我在这里只输入数字!” . 并且文本框没有说明它接受的文本格式。

于 2012-04-18T15:22:18.503 回答
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);
}

就像罗伯特哈维的回答一样,这种方法将“吞下”任何按键,当附加到文本框的当前文本值时,与正则表达式不匹配。您不仅可以将此 MaskedTextBox 用于数字条目,还可以用于需要纯字母值、纯字母数字(无符号或空格)、有效本地或网络路径、IP 地址等的文本框。

于 2012-04-18T15:51:36.000 回答