しらいしさん…

linuxに1000回くらい殺されてるしとりまmicrosoft様をageてくわ

Enterでコントロールのフォーカスを移動させる

一つのテキストボックスで入力が終わったり、ボタンでも押し終わった時にエンターで次の項目にフォーカスを充てるようにしたいときのおまじない。shiftで逆走する

①Formのプロパティ「keypreview」をtrueにする

f:id:HSShiraisi:20170616172211p:plain

②「keypreview」を設定したformクラスに「keydown」イベントメソッドを設定

f:id:HSShiraisi:20170616172424p:plain

③以下のコードをイベントメソッド内部に記述

 if (e.KeyCode == Keys.Enter)
  {
    if (e.Shift)
    {
      ProcessTabKey(false);
    }
    else
    {
      ProcessTabKey(true);
    }
  }

④タブオーダーの早い順にタブが動くよ

ただしテキストに限る

※ボタン→ボタンへのフォーカス移動

「keydown」イベントではボタンから次のコントロールへのフォーカス移動ができないため、実現したい場合は「keyup」イベントを利用することになる。(書く内容は同じ)
ただ、一般的な用途を考えてボタン→ボタンとかボタン→テキストの連続操作はふつうは考えにくいのでむやみに使わないほうがよさそう。

※テキストエリアとか

③のメソッド内に「テキストエリアかどうか」を判定するロジックをつけるのがよさそう
IME変換時のエンターを受け付けてしまう場合がある様子(一行テキストボックスだと大丈夫のような)なので、テキストエリアは別キー(Altとか)を加えるなりのほうがよさげ

     //現在のコントロールが複数行テキストボックスか
        bool isMultilineTextbox = ((this.ActiveControl is TextBoxBase) &&
            ((TextBoxBase)this.ActiveControl).Multiline);

参考 探せばけっこういっぱいある

Enterキーを押した時、まるでTabキーを押したかのように、次のコントロールにフォーカスを移す: .NET Tips: C#, VB.NET