确定事件键是否为文本(不仅仅是字母数字)

6

我有一个文本框,当输入一些文本时应该执行一些操作。根据这里所述,检查是否为字母数字很容易:

if ( ( ( e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z ) ||
( e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9 ) ||
( e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9 ) )

这种方法的问题在于我还应该使用Key.OemMinusKey.OemQuestion等手动检查-?!¿[]()是否为文本按键。
有没有一种方法可以检查它是文本按键,还是我需要手动检查(在我看来不太优雅)?

1
你真的想要排除所有没有键的字符吗?例如,我的键盘上没有 Є 键,但可以说它仍然是文本。 - Jodrell
1
检查文本是否符合正则表达式可以是一个解决方案吗? - michele
1
正则表达式\p{C}匹配不可见的控制字符和未使用的代码点。无论这些字符是否映射到键都是无关紧要的。 - Jodrell
是的,但首先我不能使用该表达式来区分OemQuestion(?)和Enter,因为我没有一种简单的方法将其转换为?并检查RE。 - David Fornas
1
只是为了澄清,当我按下?键时,我得到的是e.Key等于Key.OemQuestion,但我无法得到?。 - David Fornas
显示剩余3条评论
2个回答

3

由于没有其他选择,我使用了以下代码允许几乎所有文本按键。不幸的是,这取决于键盘,所以并不是非常优雅。希望这不是应用程序中关键的方面,只是可用性问题。

bool isText = (e.Key >= Key.A && e.Key <= Key.Z) || (e.Key >= Key.D0 && e.Key <= Key.D9) || (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9)
            || e.Key == Key.OemQuestion || e.Key == Key.OemQuotes || e.Key == Key.OemPlus || e.Key == Key.OemOpenBrackets || e.Key == Key.OemCloseBrackets || e.Key == Key.OemMinus
             || e.Key == Key.DeadCharProcessed || e.Key == Key.Oem1 || e.Key == Key.Oem7 || e.Key == Key.OemPeriod || e.Key == Key.OemComma || e.Key == Key.OemMinus
              || e.Key == Key.Add || e.Key == Key.Divide || e.Key == Key.Multiply || e.Key == Key.Subtract || e.Key == Key.Oem102 || e.Key == Key.Decimal;

0

这段代码只允许数字和'.'

    private void txtJustNumber_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!char.IsDigit((char)(e.KeyChar)) &&
            e.KeyChar != ((char)(Keys.Enter)) &&
            e.KeyChar != (char)(Keys.Delete) &&
            e.KeyChar != (char)(Keys.Back))             
        {
            e.Handled = true;
        }
    }

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