使用下面的代码,向左和向右箭头键按预期工作,但无法识别向上和向下箭头(逐步执行它,在适当的情况下满足前两个条件,但后两个条件永远不会):
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"
这让我感到困惑(它向我展示了什么),但是在键左和键右上,输入了我的代码 - 无论我多么努力地咬紧牙关,它都不是用于键上和键下。
Windows 会在 UI 导航的某些键发送到窗体之前捕获它们。如果要重写此行为,则需要重载 IsInputKey
方法(并对文本字段进行子类化):
protected override bool IsInputKey(Keys keyData)
{
if (keyData == Keys.Right)
return true;
return base.IsInputKey(keyData);
}
我发现使用 PreviewKeyDown 确实有效(我不得不删除"e.Handle = 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;
}
}
因此,需要三个不同的事件来处理我正在寻找的各种键:用于常规字符的按键,用于非字符的 KeyDown(左右箭头键)和这个(PreviewKeyDown)用于向上和向下箭头键。
您可以使用以下代码:
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;
}
}
对于派对来说为时已晚,但如果有人感兴趣,请使用e.KeyValue
,例如,左箭头键e.KeyValue
37
,右箭头键39
等等。