DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォーカスの維持

環境/言語:[VB.NET]
分類:[.NET]

フォーカスを維持するためにはどうすればよいのでしょうか。
例えば3つのテキストボックスがあり、初期設定では1つめのテキストボックスにフォーカスがあるとします。Enterキーを押すことによって2つめのテキストボックス、3つめのテキストボックス、1つめのテキストボックス…というようにフォーカスが移動するようになってるとします。この状態から今度は3つめのテキストボックスへフォーカスしたら、次にEnterキーを押してもフォーカスが1つめに移動しないように、つまり、3つめのテキストボックスにフォーカスを維持したいのですがどのようなコードを書けばよいのでしょうか?どなたか助けをお貸し下さい。
  • 題名: Re[1]: フォーカスの維持
  • 著者: java.lang.Nullpo
  • 日時: 2004/09/07 17:53:48
  • ID: 6050
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2004/09/07(Tue) 18:02:12 編集(投稿者)

■No6048に返信(タカさんの記事)
> フォーカスを維持するためにはどうすればよいのでしょうか。
> 例えば3つのテキストボックスがあり、初期設定では1つめのテキストボックスにフォーカスがあるとします。Enterキーを押すことによって2つめのテキストボックス、3つめのテキストボックス、1つめのテキストボックス…というようにフォーカスが移動するようになってるとします。この状態から今度は3つめのテキストボックスへフォーカスしたら、次にEnterキーを押してもフォーカスが1つめに移動しないように、つまり、3つめのテキストボックスにフォーカスを維持したいのですがどのようなコードを書けばよいのでしょうか?どなたか助けをお貸し下さい。

FormのKeyDown()イベントで、SelectNextControl()を使用して、
フォーカス遷移する手法でしたら、以下のリンク先のコードを次のように変更してください。

http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=red&namber=5902&no=0

Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, True)
               ↓
Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, False)



■追記

 SelectNectControl()メソッドの引数は以下のとおりです。
 SelectNextControl([ctl], [forward], [tabStopOnly], [nested], [wrap])

 最後の wrap が今回当てはまる機能です。
 MSDNを参照すると...

  wrap:タブオーダーの最後のコントロールに到達した後、
     タブ オーダーの最初のコントロールから検索を続行する場合は true。
     それ以外の場合は false。

 となっております。

 > この状態から今度は3つめのテキストボックスへフォーカスしたら、次にEnterキーを押してもフォーカスが1つめに移動しないように

 これは、最後のコントロールという「意味」でしたらピッタリです。
すいません、勝手に[Enter]キーだけの前提で話をしていました。
もし[Tab]キーも加味するのであれば、横着ですが以下のようになります。

' ==================================================================================

    ' [Tab]キーをKeyDownイベントで掴めるようにするためにオーバーライド
    Protected Overrides Function ProcessDialogKey(ByVal uKeyData As Keys) As Boolean
        Select Case uKeyData
            Case Keys.Tab, Keys.Tab Or Keys.Shift
                Return False
        End Select

        MyBase.ProcessDialogKey(uKeyData)
    End Function

    ' ここで自分で次のコントロールに遷移してやり、キーイベントを終わったことにしてしまう
    Private Sub FormMain_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown
        Select Case e.KeyCode
            Case Keys.Tab, Keys.Enter
                Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, False) 
                e.Handled = True
        End Select
    End Sub

' ==================================================================================


また、ProcessDialogKey()をオーバーライドしているのですから、
以下のようにすれば、上記のKeyDown()イベントは"必要なし"です。


' ==================================================================================

    Protected Overrides Function ProcessDialogKey(ByVal uKeyData As Keys) As Boolean
        Select Case uKeyData
            Case Keys.Tab, Keys.Enter
                Me.SelectNextControl(Me.ActiveControl, True, True, True, False)
                uKeyData = Keys.None

            Case Keys.Tab Or Keys.Shift, Keys.Enter Or Keys.Shift
                Me.SelectNextControl(Me.ActiveControl, False, True, True, False)
                uKeyData = Keys.None
        End Select

        MyBase.ProcessDialogKey(uKeyData)
    End Function

' ==================================================================================


またどちらの例も、

 ・最後のコントロール → [Tab] → 遷移しない
 ・最初のコントロール → [Shift]+[Tab] → 遷移しない

なので、最初のコントロールから最後のコントロールの遷移を許可する場合は、

 ・Me.SelectNextControl(Me.ActiveControl, False, True, True, e.Shift)

とします。
ちょっと解決しないですね。すみません。
では、Enterキーを押してもイベントが起こらないようにするコードを教えていただきたいのですが…
>>6052(以下のように修正)
× MyBase.ProcessDialogKey(uKeyData)
         ↓
○ Return MyBase.ProcessDialogKey(uKeyData)

■No6053に返信(タカさんの記事)
> ちょっと解決しないですね。すみません。

私の方ではできていますので、
「なぜ」解決できないのかがわからないですね。:-)
私が勝手に質問内容を曲解してるならそれを指摘すべきだし、
そのコードじゃできないのなら、どうなったのか、
最低限「どちら」のコードで試したのかを記すべきです。

> では、Enterキーを押してもイベントが起こらないようにするコードを教えていただきたいのですが…

 ・Form::ProcessDialogKeyで[Enter]を無効にする。
 ・Form::KeyDown()イベントで、イベントを終了したことにする。

# どちらも、先の例(>>6052)を応用すればできる話なんですが :)
  • 題名: Re[4]: フォーカスの維持
  • 著者: タカ
  • 日時: 2004/09/08 10:39:57
  • ID: 6055
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
すみません。
タブオーダーの設定が3つめのテキストボックスが最後ではなかったために解決できなかったと思われます。
プログラミングが初めてなんで愚問などもおありだったかと思いますがありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板