Enterキーで入力欄を移動する


Enterキーで次の入力欄へ移動する方法について記載します。

関数を作成すれば、初期のloadでコピペするだけで使用できます。

クラスを別に作成しない例だと色々と出ていますが、クラスを別に作成すると、

一つだけひねる点がありますので、そちらのバージョンで記載します。


1.準備事項

フォームにテキストボックスを3つ程度、貼り付けて下さい。




単純にサンプルの動作確認用なので、この程度で大丈夫です。

2.関数に必要なメソッドなど


まずは次のメソッドを説明します。


Control.FindForm

例えば、次のように使用します。

Dim f As Form = CType(sender, Control).FindForm()


FindForm()ですが、Visual Studioでマウスのカーソルを合わせると、

次のように表示されます。


そのコントロールが所属しているフォームを取得する、と表示されています。

これだけだと、何に使用するのかわからないので、次のメソッドもみてみます。


Control.SelectNextControl(Control, Boolean, Boolean, Boolean, Boolean) 

こちらは次のコントロールを取得します。

例えば、次のように使用します。

f.SelectNextControl(f.ActiveControl, ((e.KeyData And Keys.Shift) <> Keys.Shift), True, True, True)

引数を順にみていくと、

1.Control

次のコントロールといいますが、どのコントロールを基準として「次」というのか、

を指定します。ここをActiveControlとすると、「現在アクティブなコントロール」の「次」

というように指定ができます。

2.Boolean

前方に移動する場合はtrue、後方に移動する場合はfalseとなります。

keycodeで場合分けをして、trueかfalseかをベタ書きしてもいいですが、

Andの演算子を使用すると、

e.KeyData And Keys.Shift) <> Keys.Shift

のように、shiftキーが押されていれば前に戻るし、押されていなければ次に進むという

ように指定ができます。

3.Boolean

TabStopプロパティがtrueのコントロールだけを移動するならtrueです。

基本的にtrueで固定で大丈夫です。

4.Boolean

子コントロールの子コントロールも含める場合はtrueです。

こちらもtrueで固定で大丈夫です。

5.Boolean

最後のコントロールになった時に、最初に戻るかどうかです。

こちらも基本的にtrueです。


3.実際の関数

この2つを組み合わせて、

Public Class Class1

 Friend Shared Sub setForeColor(ByVal cc As Control.ControlCollection)
  For Each c As Control In cc
   If TypeOf c Is TextBox Then
   AddHandler c.KeyDown, AddressOf kde
   End If
  Next c
 End Sub

 Friend Shared Sub kde(ByVal sender As Object, ByVal e As KeyEventArgs)
  If (e.KeyData And Keys.Enter) = Keys.Enter OrElse ((e.KeyData And Keys.Return) = Keys.Return) Then
   Dim f As Form = CType(sender, Control).FindForm()
   f.SelectNextControl(f.ActiveControl, ((e.KeyData And Keys.Shift) <> Keys.Shift), True, True, True)
   f = Nothing
  End If
 End Sub

End Class

新しくクラスを作成して、関数を定義します。

その関数をフォームのLoadイベントなどから読み込むだけです。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    Class1.setForeColor(Me.Controls)
End Sub


一点、補足となりますが、

  For Each c As Control In cc
   If TypeOf c Is TextBox Then
   AddHandler c.KeyDown, AddressOf kde
   End If
  Next c

の部分で、If文の中でテキストボックスの場合に限定していますが、

テキストボックスに限定する必要はありません。ここではコントロールの種類に応じて、

後々、Enterキーなどの動作を追加したり、その他の動作を追加したりできるようにするために

場合分けをしています。




Microsoftのページ(Control.FindForm

Microsoftのページ(Control.SelectNextControl



システム開発のためのVB.NETプログラミング関係一覧に戻る