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プログラミング関係一覧に戻る