【问题标题】:Masking a textbox for Numbers only but wont accept BackSpace仅为数字屏蔽文本框,但不接受 BackSpace
【发布时间】:2010-11-06 20:16:35
【问题描述】:

我有一个只需要数字的文本框。但是如果我打错了数字,我就不能退格来纠正它。我怎样才能让退格键起作用。谢谢

    private void amount_PaidTextBox_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (Char.IsNumber(e.KeyChar) != true)
        {
            e.Handled = true;
        }
    }

【问题讨论】:

  • 你不能使用蒙版的文本框吗?

标签: c# winforms masking


【解决方案1】:

您也可以添加一个检查以允许控制字符:

if (Char.IsControl(e.KeyChar) != true && Char.IsNumber(e.KeyChar) != true)
{
    e.Handled = true;
}

更新:为了回应 person-b 对代码的评论,他/她建议采用以下风格(这也是我个人的写作方式):

if (!Char.IsControl(e.KeyChar) && !Char.IsNumber(e.KeyChar))
{
    e.Handled = true;
}

【讨论】:

  • 你能不能只使用 !Char.IsControl(e.KeyChar) 和 !Char.IsNumber(e.KeyyChar) 而不是 != true?
  • @person-b:这就是我个人编写的方式,但我选择让我的代码遵循 JimDel 的约定,专注于功能而不是编码风格。
  • 我认为在这种情况下不允许使用控制字符。例如制表符是控制字符,但据我了解,作者只需要数字。
  • Tab 在常规 TextBox 中不会成为问题;它甚至不会触发 KeyPress 事件,除非您将 AcceptsTab 属性设置为 true(然后您选择了该行为)。可以使用键盘生成的大多数其他控制字符(例如换行符、回车符)在单行文本框中没有任何效果。我认为允许控制字符会很好用。
  • 同意标签,但我更喜欢更严格,只允许退格,仅此而已。
【解决方案2】:

正确答案是:

private void amount_PaidTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
    e.Handled = !сhar.IsNumber(e.KeyChar) && (e.KeyChar != '\b');
}

【讨论】:

    【解决方案3】:

    您还可以覆盖 TextChanged 事件:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        string text = (sender as TextBox).Text;
    
        StringBuilder builder = new StringBuilder(String.Empty);
    
        foreach (char character in text)
        {
            if (Char.IsDigit(character))
            {
                builder.Append(character);
            }
        }
    
        (sender as TextBox).Text = builder.ToString();
    }
    

    请注意,您必须添加代码来设置插入符号的位置。

    【讨论】:

      【解决方案4】:
      private void amount_PaidTextBox_KeyPress(object sender, KeyPressEventArgs e)
      {
           if (!Char.IsNumber(e.KeyChar) && e.KeyCode != Keys.Back)
                e.Handled = True;
      }
      

      【讨论】:

      • KeyPressEventArgs 不包含 KeyCode 属性。
      • 哦,我的错,我是凭记忆做的,并把它放在你的方法签名中。使用 KeyDown 或 Up,而不是 Press,因为 e.KeyChar 无权删除。
      【解决方案5】:

      上面的一个稍微干净的格式:

       private void amount_PaidTextBox_KeyPress(object sender, KeyPressEventArgs e)
       {
         e.Handled = !(Char.IsNumber(e.KeyChar) || (e.KeyChar==Keys.Back));
       }
      

      【讨论】:

      • 这不会编译(KeyPressEventArgs 没有 KeyCode 属性)。
      【解决方案6】:

      我发现以下方法效果很好。它包括允许退格、箭头键删除键等的额外例外。 How to allow only numeric (0-9) in HTML inputbox using jQuery?

      【讨论】:

        【解决方案7】:
        private void txt_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b')
            {
                // Allow Digits and BackSpace char
            }        
            else
            {
                e.Handled = true;
            }
        }
        

        另请参阅链接:Masking Textbox to accept only decimals decimals/12209854#12209854

        【讨论】:

          【解决方案8】:

          您可以在 Key Press 事件中使用以下内容:

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

          【讨论】:

            【解决方案9】:

            按下您的文本框,然后输入事件 从事件中双击 KeyPress 然后写这段代码

            if( e.KeyChar <'0' || e.KeyChar > '9' )
            if(e.KeyChar!=08)
            e.Handled=true;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-01-02
              • 2011-08-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-01-03
              • 1970-01-01
              相关资源
              最近更新 更多