仅使用数字格式化文本框

Posted

技术标签:

【中文标题】仅使用数字格式化文本框【英文标题】:Format textbox with numbers only 【发布时间】:2021-12-24 04:17:14 【问题描述】:

我有一个只接受数字,不接受其他字符的文本框。为此,我在 keypress 方法中创建了以下函数:

    private void txtRGIE_KeyPress(object sender, KeyPressEventArgs e)
    
        if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
        
            e.Handled = true;
        
    

当我输入时验证正在工作,我无法输入我想要的特殊字符或字母。但是,如果我复制包含点或其他字符的数字字符串并将其粘贴到字段中,它会正常接受。例如,如果您复制:323.323 / 323 并粘贴到该字段中,它将接受。如何验证我粘贴的字符,只允许数字?

【问题讨论】:

实现TextChanged事件处理程序 考虑使用MaskedTextbox 控件,这可能会使这个问题变得微不足道。 C# WinForms 应该有一个 NumericUpDown 控件,对吧? 【参考方案1】:

我有一个只接受数字的文本框

这就是缺陷;说“我这里有一把刀,我想用作螺丝刀,但我一直用它割伤自己,所以我把它锉平了,但是它太大了,无法进入螺丝孔,所以我把它锉小了,但是它不能很好地转动 + 形螺钉,并且尖端没有硬化,所以它一直在断裂..”

答案是使用+形螺丝刀,而不是反复尝试将不适合工作的东西拼凑成可以完成工作的东西

NumericUpDown 控件是完成这项工作的正确工具;它只接受数字,具有可配置的小数位和上限和下限,不能输入或粘贴字母数字文本,此外,用户可以使用向上和向下光标键更改值

NUD 是文本框的替代品,它是免费的,并且是标准库的一部分,因此无需安装任何东西 - 只需记住获取 .Value,而不是 .Text,它是decimal,因此您可能希望将其转换为其他东西以使用它(double?int?),具体取决于您的应用程序的期望

如果您不喜欢向上向下的小按钮,请参阅here

【讨论】:

【参考方案2】:

你可以使用:

private void txtRGIE_KeyPress(object sender, KeyPressEventArgs e)

  if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) &&
        (e.KeyChar != '.'))
    
            e.Handled = true;
    

    // only allow one decimal point
  if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1))
   
        e.Handled = true;
   

或者您可以使用 NumericUpDown 代替 参考this answers 让你了解更多。

【讨论】:

这个功能在我输入时有效,但是,如果我复制一个带有其他字符的表达式并将其粘贴到字段中,它不会验证,例如允许我用点保存信息。 @Favieri 使用 numericupdown【参考方案3】:

您可以使用MaskedTextBox 代替普通的。

【讨论】:

【参考方案4】:

如前所述,NumericUpDown 控件是一个不错的选择,要使其看起来像 TextBox,您可以隐藏向上/向下箭头,例如

amountNumericUpDown1.Controls[0].Hide();

或者创建一个没有向上/向下箭头的自定义版本,在这种情况下按下回车键时不会发出哔哔声。

public class SpecialNumericUpDown : NumericUpDown


    public SpecialNumericUpDown()
    
        Controls[0].Hide();
        TextAlign = HorizontalAlignment.Right;
    
    protected override void OnTextBoxResize(object source, EventArgs e)
    
        Controls[1].Width = Width - 4;
    

    public delegate void TriggerDelegate();

    public event TriggerDelegate TriggerEvent;
    protected override void OnKeyDown(KeyEventArgs e)
    
        if (e.KeyCode == (Keys.Return))
        
            e.Handled = true;
            e.SuppressKeyPress = true;

            TriggerEvent?.Invoke();

            return;
        

        base.OnKeyDown(e);
    


【讨论】:

以上是关于仅使用数字格式化文本框的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET 文本框中仅允许信用卡/借记卡号码格式

格式化剑道数字文本框

kendo数字文本框配置,用于在文本框中输入时仅限制两个十进制值

如何使文本框只接受数字并用逗号格式化数字?

C# winform 文本框里,怎么设置数字的格式?

从文本框中复制很多数字时保留数字格式