使用下面的代码,左箭头键和右箭头键按预期运行,但不识别向上和向下箭头(单步执行它,在适当的情况下满足前两个条件,但后两个条件永远不会):
private void textBox1_KeyDown(object sender, KeyEventArgs e) {
TextBox tb = (TextBox)sender;
if (e.KeyCode.Equals(Keys.Left)) {
SetFocusOneColumnBack(tb.Name);
e.Handled = true;
return;
}
if (e.KeyCode.Equals(Keys.Right)) {
SetFocusOneColumnForward(tb.Name);
e.Handled = true;
return;
}
if (e.KeyCode.Equals(Keys.Up)) {
SetFocusOneRowUp(tb.Name);
e.Handled = true;
return;
}
if (e.KeyCode.Equals(Keys.Down)) {
SetFocusOneRowDown(tb.Name);
e.Handled = true;
return;
}
}
为什么会这样,我该如何解决?
更新
这是我在踩过e.Keycode时看到的内容 . 如果我按下
-
...左箭头键,我明白了:
e.KeyCode = "LButton | MButton | Space"
-
...右箭头键,我明白了:
e.KeyCode = "LButton | RButton | MButton | Space"
-
...向上箭头键,我明白了:
e.KeyCode = "RButton | MButton | Space"
-
...向下箭头键,我明白了:
e.KeyCode = "Backspace | Space"
这让我感到困惑(它向我展示的是什么),但是在keyleft和keyright上,我的代码被输入 - 它永远不会用于键盘和键盘,无论我多么努力地咬紧牙关 .
4 回答
Windows会在每次发送到您的表单之前捕获某些用于UI导航的键 . 如果要覆盖此行为,则需要重载
IsInputKey
方法(并为文本字段创建子类):我发现使用PreviewKeyDown确实有效(我必须删除“e.Handled = true”代码,因为它不适用于PreviewKeyDown事件):
因此,需要三个不同的事件来处理我正在寻找的各种键:常规字符的KeyPress,非字符的KeyDown(左箭头键和右箭头键)以及上下箭头键的这一个(PreviewKeyDown) .
您可以使用此代码:
派对太晚了,但如果有人感兴趣,请使用
e.KeyValue
作为示例,左箭头键为e.KeyValue
为37
,右箭头键为39
,依此类推 .