如何在keypress事件中接受退格键?

30

这是我的代码:

private void txtAdd_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar)) && !(char.IsWhiteSpace(e.KeyChar)))
    {
        e.Handled = true;
    }
}

它允许我输入字母、数字和空格,但不允许我使用退格键。请帮帮我。

11个回答

40

我喜欢使用 !Char.IsControl(e.KeyChar),这样所有像退格键和剪贴板快捷键一类的“控制”字符都会被排除。

如果你只想检查退格键,你可能可以使用以下代码:

if (e.KeyChar == (char)8 && ...)

刚刚测试过了 - 与(char)8 的比较确实有效。 - Matt Hamilton
12
建议使用 '\b' 代替 (char)8 - Alex Humphrey
12
我认为更好的写法是(char)Keys.Back - Antonio

20

我经常使用以下两个代码段:

这个代码段用于将文本框限制为只能输入整数,但允许控制键:

if (Char.IsDigit(e.KeyChar)) return;
if (Char.IsControl(e.KeyChar)) return;
e.Handled = true;

这个用于限制文本框只能输入浮点数,只允许一个".",并允许控制键:

if (Char.IsDigit(e.KeyChar)) return;
if (Char.IsControl(e.KeyChar)) return;
if ((e.KeyChar == '.') && ((sender as TextBox).Text.Contains('.') == false)) return;
if ((e.KeyChar == '.') && ((sender as TextBox).SelectionLength == (sender as TextBox).TextLength)) return;
e.Handled = true;

7
你需要在你的代码中添加!(char.IsControl(e.KeyChar)),就可以了。
private void txtNombre_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar)) && !(char.IsControl(e.KeyChar)) && !(char.IsWhiteSpace(e.KeyChar)))
            {
                e.Handled = true;
            }
        }

4

在KeyPress事件中,退格键不会被触发。因此,您需要在KeyDown或KeyUp事件中捕获它,并设置SuppressKeyPress属性为true,以防止退格键更改文本框中的文本:

private void txtAdd_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Back)
    {
        e.SuppressKeyPress = true;
    }
}

4
退格键会触发一个按键事件。 - Antonio

3

针对您的问题,请尝试以下方法,当按下退格键时有效:

e.KeyChar == ((char)Keys.Back)

1

从文档中得知:

非字符键不会触发KeyPress事件;但是,非字符键会触发KeyDown和KeyUp事件。


5
如果情况如此,那么文档是错误的。我已经测试了从KeyPress事件中提取的(char)8,并且它肯定被触发了。 - Matt Hamilton
+1 我完全满意Ed S.为什么在有“按键弹起”和“按键按下”事件的情况下还要使用“类型转换”。在正常情况下,我们应该避免“类型转换”。只有在没有其他选择时才应该使用“类型转换”。 - Mr_Green
我同意Antonio和上面的Matt Hamilton之前的帖子,即使在文档中,KeyPress事件也会在按下退格键时触发。 - David Carr

0

只允许输入数字和退格键

private void txt_KeyPress(object sender, KeyPressEventArgs e)
{
   e.Handled = !(char.IsDigit(e.KeyChar) || e.KeyChar == (char)8);
}

0

这可能会对你有所帮助

if(Keys.KeyCode==Keys.Back){
   e.Handled =true;
 }

0
private void KeyPressNameSurname(object sender, KeyPressEventArgs e)
 {
     if (char.IsPunctuation(e.KeyChar) || char.IsSymbol(e.KeyChar) || char.IsDigit(e.KeyChar) )
     {
        e.Handled = true;
        myTextBox.Text = "Not Valid";
        myTextBox.Visible = true;
     }
     else
     {
        myTextBox.Visible = false;
     }
  }

0

虽然这是一个非常老的问题,但有些人可能会发现代码无法正常工作。
我尝试使用此代码在RichTextBox中捕获BACKSPACE键按下事件
也就是使用public void rtbInfo_TextChanged(Object sender, EventArgs e)
是的,在不添加此行代码的情况下,无法检测到BACKSPACE键按下事件

public frmRTB()
    {
        InitializeComponent();
        rtbInfo.KeyPress += rtbInfo_KeyPress;
    }

看起来你需要注册组件或者说工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接