こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

TabIndexを使わないで、フォーカスの移動

ご多忙中大変申し訳ありません。
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 です。

ご迷惑を、おかけしますが、どうかご助力をお願いいたします。

投稿日時 - 2012-07-22 06:28:42

QNo.7603839

暇なときに回答ください

質問者が選んだベストアンサー

どこがどううまくいかないんでしょうか?
書かれているコードは、TextBox15の次がTextBox16となってしまう点だけ除けば問題ないと思いますが。

投稿日時 - 2012-07-24 03:37:43

お礼

お返事有難う御座いました。nag0720さんのご指摘のとおり、TextBox15の次がTextBox16となってしまう点だけ除けば問題なく、↓キーによるフォーカスの移動はできていました。
何回もテストしているうちに、わけがわからなくなってしまい、「これはできない」と判断してしまったのかもしれません。ご迷惑おかけしました。

nicotinismさん、nag0720さん、まだまだわからないことだらけですので、これからも宜しくおねがいします。

解決した場合は、ベストアンサーを選ばないといけませんので、nicotinismさん、nag0720さんご両者の回答をベストアンサーにしたいのですが、そのような設定はありませんので、nag0720さんの回答をベストアンサーにさせてください。

投稿日時 - 2012-07-24 06:09:37

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

コントロール配列 vb.net
でGoogleっただけですけど (^^ゞ
http://www.geocities.jp/hatanero/indexer.html
などが参考になるかと思います。

また、たとえば、TabIndex【6】を例にとると
3列5行のレイアウトなので
6 ÷ 3 の商 + 1 で行位置が → 3
6 ÷ 3 の余り で列位置が得られますので → 0
これを座標代わりに使って
左右キーなら
・・・・・・
ではなくて。。。単純に6±1の増減を
上下キーなら6±3の増減
範囲外のチェック・・
でいけませんかね?

投稿日時 - 2012-07-23 06:50:33

お礼

わざわざ、調べてくださり有難うございました。nag0720さんの言われるとおり、
TextBox15の次がTextBox16となってしまう点だ修正すれば、↓キーのフォーカスは出来ていました。お騒がせして申し訳ありませんでした。

投稿日時 - 2012-07-24 05:57:32

あなたにオススメの質問