6

以下のコードでは、左矢印キーと右矢印キーは期待どおりに機能しますが、上矢印と下矢印は認識されません (ステップスルーすると、最初の 2 つの条件は適切に満たされますが、次の 2 つの条件は満たされません)。

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"

これは私を困惑させました(それが私に示していることです)が、キーレフトとキーライトでコードが入力されます-歯をどれだけ強く食いしばっても、キーアップとキーダウンでは決してありません。

4

4 に答える 4

4

Windows は、フォームに送信される前に、UI ナビゲーション用の特定のキーをキャプチャします。この動作をオーバーライドしたい場合は、IsInputKeyメソッドをオーバーロードする (そしてテキスト フィールドをサブクラス化する)必要があります。

    protected override bool IsInputKey(Keys keyData)
    {
        if (keyData == Keys.Right)
            return true;
        return base.IsInputKey(keyData);
    }
于 2012-05-09T16:47:51.423 に答える
3

PreviewKeyDownを使用しても機能することがわかりました(PreviewKeyDownイベントには適用されないため、「e.Handled = true」コードを削除する必要がありました)。

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

したがって、私が探していたさまざまなキーを処理するには、3つの異なるイベントが必要でした。通常の文字の場合はKeyPress、非文字の場合はKeyDown(左右の矢印キー)、上下の矢印キーの場合はこのイベント(PreviewKeyDown)です。

于 2012-05-09T17:45:04.493 に答える
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;
    }
}
于 2013-12-24T09:53:04.253 に答える
1

パーティーには遅すぎますが、誰かが興味を持っている場合は、e.KeyValue代わりに、例として、e.KeyValue左矢印キーは37、右矢印キー39などを使用してください。

于 2015-04-08T21:36:40.970 に答える