【问题标题】: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 控件,对吧?

标签: c# .net winforms


【解决方案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);
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多