ご多忙中大変申し訳ありません。
VBの初心者です。
TabIndexを使わないで、コントロールの名前の番号でフォーカスの移動をしたいのですが、私のレベルでは全くできません。
TextBox1、TextBox2、TextBox3、TextBox3、~TextBox15
のようにTextBoxの後ろに付いている、数字を利用してフォーカスの移動をしたいと思っております。
実装前に下記のようなコードを書いてテストしていますが、どこを調べても、また試行錯誤を繰り返してもできません。
Public Class Form1
'テスト
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Me.KeyPreview = True
'1列目TextBoxの生成
Dim i As Integer
For i = 0 To 4
Dim txtbx As New TextBox
txtbx.Size = New Size(105, 30)
txtbx.Location = New Point(50, 50 + i * 40)
txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular)
txtbx.TabIndex = i * 3
txtbx.Text = "TabIndexは" & CStr(i * 3)
txtbx.Name = "TextBox" & CStr(i + 1)
Me.Controls.Add(txtbx)
Next
'2列目TextBoxの生成
For i = 0 To 4
Dim txtbx As New TextBox
txtbx.Size = New Size(105, 30)
txtbx.Location = New Point(160, 50 + i * 40)
txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular)
txtbx.TabIndex = i * 3 + 1
txtbx.Text = "TabIndexは" & CStr(i * 3 + 1)
txtbx.Name = "TextBox" & CStr(i + 6)
Me.Controls.Add(txtbx)
Next
'3列目TextBoxの生成
For i = 0 To 4
Dim txtbx As New TextBox
txtbx.Size = New Size(105, 30)
txtbx.Location = New Point(270, 50 + i * 40)
txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular)
txtbx.TabIndex = i * 3 + 2
txtbx.Text = "TabIndexは" & CStr(i * 3 + 2)
txtbx.Name = "TextBox" & CStr(i + 11)
Me.Controls.Add(txtbx)
Next
End Sub
Private Sub Form1_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
If e.KeyCode = Keys.Right Then '→キーによるフォーカスの移動
Me.SelectNextControl(ActiveControl, True, True, True, False)
e.Handled = True
ElseIf e.KeyCode = Keys.Left Then '←キーによるフォーカスの移動
Me.SelectNextControl(ActiveControl, False, True, True, False)
e.Handled = True
End If
'↓(Down)キーによるフォーカスの移動 ここができません。
If e.KeyCode = Keys.Down Then
Dim txtboxname As String
txtboxname = Me.ActiveControl.Name 'TextBoxの名前の名前の取得
Dim txtbxnum As String
txtbxnum = txtboxname.Remove(0, 7) 'TextBox~の名前から、~(数字)だけにする。
Dim controlName As String
controlName = "TextBox" & CStr((CInt(txtbxnum) + 1)) 'TextBox~の名前の~に1を足す。
Me.Controls(controlName).Select() 'TextBox~+1のTextBoxをフォーカス
'Select() Focus()も結果は同じです。
End If
'↑(Down)キーによるフォーカスの移動
'この部分は、↓(Down)キーによるフォーカスの移動が出来るようになりましたら、追加します
End Sub
' Enterキーによるフォーカスの移動
Private Sub Form1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
If e.KeyChar = Chr(Keys.Enter) Then
Me.SelectNextControl(ActiveControl, True, True, True, True)
e.Handled = True
End If
End Sub
End Class
最終的な目的の動作は、EnterキーではTabIndexの順番にフォーカスの移動。
←キーでは、左にフォーカスの移動。
→キーでは、右にフォーカスの移動。
↑キーでは、上にフォーカスの移動。
↓キーでは、下にフォーカスの移動。
コントロールの名前の番号でフォーカスの移動をしたい理由は、
Enterキーと←、→キーによるフォーカスの移動でTabIndexの順番を使い、上下方向、↑キー、↓キー移動には、TabIndexの順番が画像のように少々複雑になってしまい、TabIndexを使用してのフォーカスの移動は断念しました。
もし、TabIndexでフォーカスの移動が出来るようなら、そちらのほうでもかまいません。
使用バージョンは、VB2010 Express Edition です。
ご迷惑を、おかけしますが、どうかご助力をお願いいたします。
お礼
お返事有難う御座いました。nag0720さんのご指摘のとおり、TextBox15の次がTextBox16となってしまう点だけ除けば問題なく、↓キーによるフォーカスの移動はできていました。 何回もテストしているうちに、わけがわからなくなってしまい、「これはできない」と判断してしまったのかもしれません。ご迷惑おかけしました。 nicotinismさん、nag0720さん、まだまだわからないことだらけですので、これからも宜しくおねがいします。 解決した場合は、ベストアンサーを選ばないといけませんので、nicotinismさん、nag0720さんご両者の回答をベストアンサーにしたいのですが、そのような設定はありませんので、nag0720さんの回答をベストアンサーにさせてください。