【问题标题】:How to enable control key functionality in windows form application?如何在 Windows 窗体应用程序中启用控制键功能?
【发布时间】:2018-01-04 22:26:15
【问题描述】:

我正在使用以下文本框 keypress() 事件来捕获用户输入的击键,以限制用户输入字母和数字值。

private void textBoxName_KeyPress(object sender, KeyPressEventArgs e)
{
    e.Handled = !(char.IsLetter(e.KeyChar) || 
                  e.KeyChar == (char)Keys.Space || 
                  e.KeyChar == (char)Keys.Back || 
                  e.KeyChar==(char)Keys.ControlKey );
} 

现在的问题是通过使用上述代码,即使在 keypress 事件中处理了 keys.ControlKey,我也无法使用 Ctrl+C 或 Ctrl+v 等快捷键。
我在这里做错了什么?

提前致谢。

【问题讨论】:

    标签: c# winforms textbox


    【解决方案1】:

    如果在没有任何其他键的情况下按下 Control 键,则不会引发 Keypress 事件。仅用作键修饰符。在这种情况下,e.KeyChar 返回 char.IsLetter() 认为 false 的修改值,! 运算符将其转换为 true 并将其分配给 e.Handled,从而取消按键事件。

    捕获用户输入的击键以限制用户输入 字母数字值。

    如果如您所说,数字是所需输入的一部分,则应使用char.IsLetterOrDigit() 而不是char.IsLetter()

    还有标点符号?也是输入的一部分吗?
    这些符号被char.IsPunctuation() 视为标点符号:\"%&/()?*@.,:;_-'

    两种方法得到相同的结果。
    在两者中,char.IsControl(e.KeyChar) 用于检查 Control 是否是 Keycode 的一部分,如果是,则通过 XOR(ing) 将其剥离。

    1) 使用简单的正则表达式进行过滤。这让您可以更好地控制要过滤的内容。

    Regex _KeyFilter = new Regex(@"^[a-zA-Z0-9.,]");
    
    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
       if (e.KeyChar != (char)Keys.Back && e.KeyChar != (char)Keys.Return && e.KeyChar != (char)Keys.Space)
       {
            e.Handled = !_KeyFilter.IsMatch((char.IsControl(e.KeyChar)
                                          ? (char)(e.KeyChar ^ 64) 
                                          : e.KeyChar).ToString());
       }
    }
    

    2) 使用char.IsLetterOrDigit()char.IsPunctuation() 过滤

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
       if (e.KeyChar != (char)Keys.Back && e.KeyChar != (char)Keys.Return && e.KeyChar != (char)Keys.Space)
       {
           char _keypress = char.IsControl(e.KeyChar) ? (char)(e.KeyChar ^ 64) : e.KeyChar;
           e.Handled = !char.IsLetterOrDigit(_keypress) && !char.IsPunctuation(_keypress);
       }
    }
    

    【讨论】:

    • 以上代码适用于 char.isLetter() 但不适用于 char.isLetterOrDigit() 或 char.isNumber()。
    • @sheikh muzammil 这很有趣。当然,我已经对其进行了测试,并且对我来说效果很好,但是我不知道您要过滤什么。您能否详细说明在第二个代码 sn-p 中什么不起作用?你用的是什么类型的键盘?机器语言,是西方的还是东方的?
    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 2011-07-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多