C# 如何在windows窗体应用程序中启用控件键功能?

C# 如何在windows窗体应用程序中启用控件键功能?,c#,winforms,textbox,C#,Winforms,Textbox,我正在使用以下textbox keypress()事件捕获用户输入的击键,以限制用户输入字母和数字值。 private void textBoxName_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = !(char.IsLetter(e.KeyChar) || e.KeyChar == (char)Keys.Space || e.KeyChar

我正在使用以下textbox 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 );
} 
现在的问题是,通过使用上述代码,我无法使用快捷键,如Ctrl+C或Ctrl+v,即使keys.ControlKey在按键事件中被处理。
我做错了什么


提前谢谢

如果在没有任何其他键的情况下按下控制键,则不会引发按键事件。仅用作关键点修改器。在这种情况下,
e.KeyChar
返回一个修改后的值,
char.isleter()
考虑
false
运算符在
true
中对其进行转换,并将其分配给
e.Handled
,从而取消按键事件。

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

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

还有标点符号?也是输入的一部分吗?
char.ispuncuation()
\“%&/()?*@,:;-”

两种方法的结果相同。
在这两种情况下,
char.IsControl(e.KeyChar)
用于检查控件是否是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.isletorDigit()
char.ispuncuation()

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);
   }
}

如果在没有任何其他键的情况下按下控制键,则不会引发Keypress事件。该事件仅用作键修饰符。在这种情况下,
e.KeyChar
返回一个修改后的值,该值为
char.IsLetter()
认为
为假
操作符在
为真
中对其进行转换,并将其分配给
e.Handled
,从而取消按键事件。

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

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

标点符号也是输入的一部分吗?
char.ispuncuation()
\“%&/()?*@,:;\u-”将这些符号视为标点符号

两种方法的结果相同。
在这两种情况下,
char.IsControl(e.KeyChar)
用于检查控件是否是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.isletorDigit()
char.ispuncuation()

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.isleterordigit()或char.isNumber()。@sheikh muzammil,这很有趣。当然我已经测试过了,对我来说效果很好,但是我不知道你想要过滤什么。您能否详细说明第二个代码段中的哪些失败之处?你用的是什么样的键盘?机器语言,是西方的还是东方的?上面的代码适用于char.isLetter(),但不适用于char.isleterordigit()或char.isNumber()。@sheikh muzammil这很有趣。当然我已经测试过了,对我来说效果很好,但是我不知道你想要过滤什么。您能否详细说明第二个代码段中的哪些失败之处?你用的是什么样的键盘?机器语言,是西方的还是东方的?