使用下面的代码,左箭头键和右箭头键按预期运行,但无法识别向上和向下箭头(单步执行它,在适当的情况下满足前两个条件,但后两个条件永远不会):< / p>
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上,我的代码被输入了 - 无论我是多么努力地咬紧牙关,它都不会用于键盘和键盘。
答案 0 :(得分:3)
Windows会在每次发送到您的表单之前捕获用于UI导航的某些键。如果要覆盖此行为,则需要重载IsInputKey
方法(并将文本字段子类化):
protected override bool IsInputKey(Keys keyData)
{
if (keyData == Keys.Right)
return true;
return base.IsInputKey(keyData);
}
答案 1 :(得分:3)
我发现使用PreviewKeyDown确实有效(我必须删除“e.Handled = true”代码,因为它不适用于PreviewKeyDown事件):
private void textBoxQH1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) {
TextBox tb = (TextBox)sender;
if (e.KeyCode.Equals(Keys.Up)) {
SetFocusOneRowUp(tb.Name);
return;
}
if (e.KeyCode.Equals(Keys.Down)) {
SetFocusOneRowDown(tb.Name);
return;
}
}
因此,需要三个不同的事件来处理我正在寻找的各种键:常规字符的KeyPress,非字符的KeyDown(左右箭头键)和上下箭头键的这一个(PreviewKeyDown)
答案 2 :(得分:1)
您可以使用此代码:
private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Up:
//Do stuff
break;
case Keys.Down:
//Do stuff
break;
case Keys.Left:
//Do stuff
break;
case Keys.Right:
//Do stuff
break;
}
}
答案 3 :(得分:1)
派对太迟了,但如果有人有兴趣,请使用e.KeyValue
代替,例如,e.KeyValue
左箭头键为37
,右箭头键为{{1}等等。