当用户尝试使用KeyDown事件尝试仅将有用数据输入到表单字段时,我正尝试触发事件执行某些工作。但是,我不断收到错误警报,因为KeyDown事件适用于任何密钥!
我正在尝试不要为“Alt,Control,Shift,Esc,F键等”按钮触发事件。这样做的最佳方式是什么?
到目前为止我所拥有的是:
private void formControl_KeyModified(object sender, KeyEventArgs e)
{
if (e.KeyCode != Keys.Shift && e.KeyCode != Keys.CapsLock && e.KeyCode != Keys.Tab && e.KeyCode != Keys.Escape &&
e.KeyCode != Keys.Insert && e.KeyCode != Keys.Home && e.KeyCode != Keys.End && e.KeyCode != Keys.PageUp &&
e.KeyCode != Keys.PageDown && e.KeyCode != Keys.Up && e.KeyCode != Keys.Down && e.KeyCode != Keys.Left &&
e.KeyCode != Keys.Right && e.KeyCode != Keys.Control && e.KeyCode != Keys.Alt && e.KeyCode != Keys.NumLock &&
e.KeyCode != Keys.Insert && e.KeyCode != Keys.None && e.KeyCode != Keys.PrintScreen && e.KeyCode != Keys.Help &&
e.KeyCode != Keys.ControlKey && e.KeyCode != Keys.ShiftKey && e.KeyCode != Keys.Sleep && e.KeyCode != Keys.LWin &&
e.KeyCode != Keys.RWin && e.KeyCode != Keys.RMenu && e.KeyCode != Keys.LMenu && e.KeyCode != Keys.LShiftKey &&
e.KeyCode != Keys.RShiftKey && e.KeyCode != Keys.Pause && e.KeyCode != Keys.F1 && e.KeyCode != Keys.F2 &&
e.KeyCode != Keys.F3 && e.KeyCode != Keys.F4 && e.KeyCode != Keys.F5 && e.KeyCode != Keys.F6 && e.KeyCode != Keys.F7 &&
e.KeyCode != Keys.F8 && e.KeyCode != Keys.F9 && e.KeyCode != Keys.F10 && e.KeyCode != Keys.F11 && e.KeyCode != Keys.F12 &&
e.KeyCode != Keys.L)
{
// Do some work...
}
}
但是,这似乎不是解决这个问题的最好方法。 同样,我只是想获取可以输入文本框的字符的键(例如213135udf!@#%@!#@#%15nfaosdf〜!@} {:?&gt ;, 等等)!任何帮助都将不胜感激,谢谢!
此致 艾萨克D.
(为清晰度和质量而编辑)
答案 0 :(得分:1)
您可以将所有值都放入HashSet<T>
并检查KeyCode是否在集合中。
var invalidKeys = new HashSet<Keys> { Keys.Shift, Keys.CapsLock, Keys.Tab, ... Keys.L };
if (!invalidKeys.Contains(e.KeyCode))
{
// Do some work...
}
或者,由于您正在检查是否相等,所以您可以将所有内容都放入switch语句中。
switch (e.KeyCode)
{
case Keys.Shift:
case Keys.CapsLock:
case Keys.Tab:
// ...
case Keys.L:
break;
default:
// Do some work...
break;
}
答案 1 :(得分:1)
你可以举例说(有许多好的尝试)检查this page以获取Char
类的帮助,你可以使用IsLetterOrDigit等方法或其他函数。现在我无法识别您是否使用Windows窗体?如果是这样,请使用像(char)e.KeyCode
这样的简单演员来获取字符。
示例:
private void formControl_KeyModified(object sender, KeyEventArgs e)
{
char c = (char)e.KeyCode;
if (Char.IsLetterOrDigit(c)) {
// useful
}
// might add more checks
// else if (Char.IsPunctuation(c)) ...
}
答案 2 :(得分:0)
您可以处理表单的KeyPress事件。上述事件将KeyPressEventArgs作为其参数参数。
使用Char.IsLetterOrDigit函数检查KeyPressEventArgs.KeyChar属性的值。
private void form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if (char.IsLetterOrDigit(e.KeyChar)) {}
else { e.Handled = false; }
}
修改强>
您还可以尝试列出已接受的Char
值列表,然后检查其中是否包含预置字符:
private void form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
List<Char> charList = new List<Char>;
charList.AddRange(new Char[] { 'a', 'b' ... });
if (charList.Contains(e.KeyChar)) {}
else { e.Handled = false; }
}
答案 3 :(得分:0)
如果您关心if语句的执行时间,请创建Key值的SortedList并检查SortedList是否包含您的密钥。
一个可能更好的解决方案是使用Forms TextBox“TextChanged”事件而不是使用KeyDown事件。
答案 4 :(得分:0)
就像@Daniel在他的评论中所述,或许白名单上的有效密钥优于黑名单所有那些你不感兴趣的内容。因此,假设您只对字母键和数字感兴趣,就可以像the msdn Keys example
中描述的那样进行操作。if(e.KeyCode > Keys.NumPad0 && e.KeyCode < Keys.NumPad9 ||
e.KeyCode > Keys.D0 && e.KeyCode < Keys.D9 ||
e.KeyCode > Keys.A && e.KeyCode < Keys.Z) {
//do useful stuff here
}