VB.NETでボタンクリックイベントで次のコントロールへ

このQ&Aのポイント
  • VB開発初心者のため、VB.NETでWindowsMobile5.0開発をしています。タブキーでコントロールを移動させるために、ボタンクリックイベントで次のコントロールにフォーカスを移動させたいと思っていますが、うまくいきません。ActiveControlを使用した方法は.NETCONPACTFreameWorkではサポートされていません。他に良い方法はありますか?
  • VB開発初心者のため、VB.NETでWindowsMobile5.0開発をしています。タブキーでコントロールを移動させるために、ボタンクリックイベントで次のコントロールにフォーカスを移動させたいと思っていますが、うまくいきません。ActiveControlを使用した方法は.NETCONPACTFreameWorkでは使えません。他に有効な方法はありますか?
  • VB開発初心者のため、VB.NETでWindowsMobile5.0開発をしています。タブキーでコントロールを移動させるために、ボタンクリックイベントで次のコントロールにフォーカスを移動させたいと思っていますが、ActiveControlを使用した方法は.NETCONPACTFreameWorkでは利用できません。他の方法はありますか?
回答を見る
  • ベストアンサー

VB.NETでボタンクリックイベントで次のコントロールへ

VB開発初心者です。 VB.NETでWindowsMobile5.0開発してます。 .NETCONPACTFreameWork2.0です。 TABキーで移動するように ボタンクリックイベントで次のコントロールへFocusを移動させたいのですがうまく行きません。 下記の記述すればOKだと思いましたが、 Me.SelectNextControl(Me.ActiveControl, True, True, True, True) ActiveControlを.NETCONPACTFreameWorkがサポートしてませんでした。 ほかに良い方法ありませんでしょうか? 宜しくお願いします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

> ctlPrevはプライベート変数なので これではダメですね 『プライベート変数』という表現もおかしいと思います 本来は『ローカル(局所)変数』とすべきでしょう 『フォームクラスのスコープを持つ変数』としてctlPrevを宣言しましょう PublicでもPrivateでもProtectedでも構いません

glee_sss
質問者

お礼

早速の回答ありがとうございます。 下記のように記述しうまく行きました。 Public Class SetForm Public ctlPrev As Control Private Sub TextBox_LostFocus(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.LostFocus, TextBox2.LostFocus, TextBox3.LostFocus, TextBox4.LostFocus, TextBox5.LostFocus, TextBox6.LostFocus 'MessageBox.Show("LostFocusイベントが発生しました。") ctlPrev = CType(sender, Control) End Sub お陰様でいつも助かっております。 ありがとうございました。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

LostFocusイベントが発生しいた時点でフォーカスを持っているのは引数で示されたSenderオブジェクトになると思います Me.SelectNextControl( Sender, True, True, True, True ) でいいように思いますが これでは支障が出るのでしょうか?

glee_sss
質問者

お礼

回答、誠にありがとうございます。 自分の考え方を纏めてみます。 LostFocusイベントで TextBox1コントロールをctlPrevに格納し、 ボタンクリックイベントで Me.SelectNextControl(ctlPrev , True, True, True, True) と考えて下記のように記述しましたがctlPrevはプライベート変数なのでボタンクリックイベントで使えませんでした。 この考え方で正しいでしょうか? またこのような場合どうすればいいんでしょうか? 初歩的な質問かもしれませんがご教授のほどよろしくお願いします。 Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As EventArgs) MessageBox.Show("LostFocusイベントが発生しました。") Dim ctlPrev As Control ctlPrev = CType(sender, Control) End Sub Private Sub Button51_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button51.Click Me.SelectNextControl(ctlPrev , True, True, True, True) End Sub

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

フォームクラスの変数に dim ctlPrev as Control を追加 フォーカスを制御したいコントロールの LostFocusイベントを処理して ctlPrev = CType(Sender,Control) としておきます 次への処理で Me.SelectNextControl( ctlPrev, True, True, True, True) としてやればいいのではないでしょうか ActiveControlを使ってボタンClickイベントでの処理ではそのボタンの次のTabStopのコントロールにしか移動できません Clickした時点でActiveControlが移動してしまうため …

glee_sss
質問者

お礼

いつもお世話になっております。 LostFocusを行って次の処理を考えておりますが、 現在のFocusの位置を知るにはどうすればいいんですか? Me.SelectNextControl(”現在のフォーカス位置”, True, True, True, True) とすれば次のコントロールへFocusが移動するはずですが・・・

関連するQ&A

  • VB.Net フォームのKeyPressイベント

    お世話になります。 日夜 VB.Net でAccess ADPファイルで作ったシステムのリメイクをしております、駆け出しの者でございます。 フォームのイベントでKeyPressイベントがありますが、 Me.ActiveControl.BackColor = Color.LavenderBlush この記述で、フォーム上に配置されているテキストボックなどの背景色を変えられるのですが、マウスで、各コントロールをクリックしても背景色が変わりません。 フォームのClick関係、Mouse関係のイベントで同じ記述をしても、フォームに配置してあるコントロールには適応されないようで、どうしたものかと思っております。(どこか見逃しているのか?!) マウスでテキストボックスなどのコントロールをクリックした時にそのコントロールの背景色を変えるには、例えば100個のテキストボックスがあった場合には、100個のClickイベントに背景色を変えるコードを記述する必要があるのでしょうか?(それは大変だと思うのですが・・・) もし、フォームのマウス、クリックのイベントで ActiveControl の背景色が変更できるイベントや、その他、やり方があるようでしたら、何卒ご紹介いただけますようよろしくお願いいたします。

  • VB.NET ボタン押下で一つ前のコントロールへ

    お世話になります。 VisualStudio2010 InputMan6.0 上記を使用して、VB.NETで開発をしております。 いくつかテキスト・コンボコントロールが並んでいるFormで、ボタンを押下することで それまでカーソルがあったコントロールの一つ前のTabIndexがあるコントロールへ カーソルを遷移させたいのですが、うまく動きません。 SelectNextControlを使ってみても、ボタン押下の段階でボタンがActiveなコントロールと なってしまうため、ボタンの一つ前のコントロールにカーソルが移動してしまいます。 うまい方法はないでしょうか?

  • VB6.0のデザイン時 コントロールの移動 Vista

    プログラマです。 VB6.0のデザイン時に配置されたコントロールを矢印キーで移動しようとすると、 他のコントロールにフォーカスがうつってしまい配置を変更できません。 (現在はマウスで配置を移動させています) デザイン時に矢印キーでコントロールの配置位置を移動させる設定などありますか? 開発環境 -VB6.0(SP6) -OS Windows Vista Business SP1

  • 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 です。 ご迷惑を、おかけしますが、どうかご助力をお願いいたします。

  • タブ移動で最後のTabIndexまで行くと頭から繰り返さないようにしたい

    環境は、VB.NETです。 タブ移動で、最後のTabIndexまでカーソルが行くと、その次は、また頭から(最初のTabIndexから)繰り返しますが、それを止めたいです。 つまり、最後のTabIndexまでカーソルが行くと、いくらTabキーを押しても、そのコントロールにカーソルをとどめておきたいのです。 しかし、逆タブ(Shift+Tab)を押すと、TabIndexをさかのぼって、最初のTabIndexのコントロールまでバックさせたいです。 で、頭のコントロールにカーソルをたどり着くと、またそこでとどまるといった動きを実現したいと思っています。 何か、良い方法がございましたら、ご教授下さいませ。 ちなみに、以下のコードで、Enterキーを使ってタブ移動させています。 Select Case e.KeyCode  Case Keys.Enter   Dim bThrough As Boolean = False   If TypeOf Me.ActiveControl Is Edit Then    If (CType(Me.ActiveControl, Edit)).Multiline = True Then     bThrough = True    End If   End If   If bThrough = False Then    Dim forward As Boolean = e.Modifiers <> Keys.Shift    'this.ProcessTabKey(forward);    Me.SelectNextControl(Me.ActiveControl, forward, True, True, True)   End If   ・   ・   ・ End Select

  • VB6からの移行したいけど、VB.NETのコントロール配列は?

    VB6ではフォーム上にボタンコントロールとかを配列で作成できクリックされた時にはボタンイベントのインデックス値によってどのボタンを押されたが判断できて各処理を記述できていましたが、VB.NETでは同じようにはできないようです。オブジェクト指向的?にはこちらがいいのでしょうが、どうも面倒くさくなったなぁというイメージしかわかず、なぜこの方がいいのかという納得いく書籍とかも見つけることができていません。 どなたか、ご教授頂きたいのですがよろしくお願いします。参考になる書籍やWEBとかもありましたらお教えいただければ幸いです。

  • VB.NET2003でのTABControlイベントについて

    TabControlの処理について教えて下さい。 TabControlの外に貼り付けたTextBoxの内容が変更された場合、タブのページを変える前に問い合わせのメッセージを表示したいのですがうまくいきません。 具体的には、TabControlのSelectedIndexではページが変わった後にイベントが発生するので遅いのです。また、TabPageのValidatingでは、タブ上のコントロールにフォーカスが当たっていないとイベントすら発生しないし... アドバイスをよろしくお願いします。

  • ↓Downキーでフォーカスの移動ができません。

    ご多忙中申し訳ありません。 TextBoxが複数ありまして、↓キーを使用してフォーカスの移動をタブインデックスに従って変更したいのですが、Enterキーなら順番に移動しますが、Downキーですと何も変化がありません。 Downキーの場合は何か、コードの追加が必要でしょうか? あと、できれば←や↑ →なども使用してフォーカスの移動をしたいとおもいますが アドバイスをお願いします。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.KeyPreview = True End Sub Private Sub Form1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress If e.KeyChar = Chr(Keys.Down) Then  '←ここの部分がEnterキーならフォーカスの移動ができます。 Me.SelectNextControl(Me.ActiveControl, True, True, True, True) e.Handled = True End If End Sub 申し訳ありません。宜しくお願いします。

  • VB6 ユーザーコントロールのフォーカス無効

    現在VB6 SP5にて、テンキーのようなユーザーコントロールを作成しています。 コマンドボタンを配置し、押された場合にキーボードの入力をエミュレートするような作りにしています。 問題は、作成したコントロールをフォームに貼り付けて使用する場合に、マウスでクリックしたキーに応じて、現在フォーカスのあるテキストボックスなどに入力したいのですが、ユーザーコントロールのコマンドボタンにフォーカスが移ってしまい、うまくいきません。 ユーザーコントロールのCanGetFocusプロパティをFalseに設定しようとすると、「フォーカスを取得できないコントロール上に配置された子コントロールは、フォーカスを取得することができません。」とエラーが表示されてFalseにできません。 フォーカスを無効にし、このような機能を実現するには何か良い方法ありますでしょうか?

  • VB6.0のEnabledをfalseにしてもクリックイベントが走ってしまう・・・

    はじめまして。 今VBでオセロゲームを作成しているのですが、コンピュータが考えているときにボタンのEnabledをfalseにしてクリックイベントを走らせないようにしています。 デバックなどをするとうまくいくのですが実際プログラムを実行するとどうしてもEnableをTrueにした後にクリックイベントが走ってしまいます。クリックイベントがたまっているようにも見えるのですが何か解決法はあるのでしょうか。よろしくお願いします。

専門家に質問してみよう