- PR -

TextBoxにフォーカスがあるとき、ButtonをクリックしたらTextBoxのフォーカスを取得できるようにしたい

投稿者投稿内容
chelsea
常連さん
会議室デビュー日: 2007/12/19
投稿数: 48
投稿日時: 2007-12-21 16:02
VB2005です。
TextBox1・2・3 とButton1があります。
TextBoxにフォーカスがあるときButtonをクリックしたら
TextBoxのフォーカスを取得できるようにしたいのですがどうもよくわかりません。

Button1_Clickのイベントハンドラ内に次のコードを書いているのですが
コード:
    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click

        If TextBox1.Focused = True Then
            Console.WriteLine("TextBox1 にフォーカスがあります")

        ElseIf TextBox2.Focused = True Then
            Console.WriteLine("TextBox2 にフォーカスがあります")

        ElseIf TextBox3.Focused = True Then
            Console.WriteLine("TextBox3 にフォーカスがあります")

        Else
            Console.WriteLine("現在選択されているコントロールは、{0}です。", _
                Me.ActiveControl.Name)

        End If

    End Sub


この状態でButton1をクリックしても「現在選択されているコントロールは、Button1です。」となります。
どのTextBoxにフォーカスを移しても、Button1をクリックした段階でButton1にフォーカスが移る、という事なのでしょうが・・・

TextBox_EnterとTextBox_Leaveのイベントハンドラをうまく使うべきなのだとは思いますが
TextBox1_Enterのイベント内に TextBox1.Focus() の一文を書いても
Button1をクリックすると結局フォーカスはButton1に移ってしまいます。

初心者質問で申し訳ありませんがどなたかよろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-12-21 16:13
TextBox1_EnterじゃなくてTextBox_Leaveに書けばとりあえずは期待した動きになるのでは?
chelsea
常連さん
会議室デビュー日: 2007/12/19
投稿数: 48
投稿日時: 2007-12-21 16:23
引用:

burton999さんの書き込み (2007-12-21 16:13) より:
TextBox1_EnterじゃなくてTextBox_Leaveに書けばとりあえずは期待した動きになるのでは?


すみません書くのを忘れていました。
すべてのTextBox_Leaveに TextBox1.Focus() (と2・3)を書いて試してみましたが
確かに取得はできるのですが、今度は別のTextBoxにフォーカスを移動させようとしても、移動ができなくなりました。

もしかしてこの状態からTabキーを押したらフォーカスを移動させたり、マウスでクリックしたらフォーカスを移動させるような記述をするものなのですか?


[ メッセージ編集済み 編集者: 未記入 編集日時 2007-12-21 16:24 ]
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-12-21 16:26
最終的にやりたいことは
・ボタンを押しても入力コントロールのフォーカスを維持したい。(テキストボックス、コンボボックス等)
・入力コントロール間のフォーカスは自由に移動したい。

ってことでしょうか?
なら、TextBox等のLeaveで、フォーカスのあったコントロールほ保存しておき。
ボタンがクリックされたら、そのコントロールにフォーカスを設定してあげるとか。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-12-21 16:33
基本的な考え方は以下のような感じです。
ただコントロールが増えると、全ての入力コントロールのイベントハンドラを書くのは面倒なんで、
AddHandlerを使って処理を共通化したほうがいいと思います。


コード:
Public Class Form1

    Private c As Control = Nothing

    Private Sub TextBox1_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.Leave
        c = DirectCast(sender, Control)
    End Sub

    Private Sub TextBox2_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.Leave
        c = DirectCast(sender, Control)
    End Sub

    Private Sub TextBox3_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.Leave
        c = DirectCast(sender, Control)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If c IsNot Nothing Then
            c.Focus()
        End If

    End Sub

End Class


まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-12-21 16:38
ボタンを押す前にどこにいたのか、ということを知りたいだけなら
Private _PrevControl As Control
で、各テキストボックスに
TextBoxX_Enter → _PrevControl = TextBoxX
その他のコントロールに
その他Control_Enter → _PrevControl = Nothing
とか。
#すべてを網羅しないといけないのがつらい。
#ハンドラを集約するのもそこそこ大変かな。
#KeyPreviewみたいにEnterPreviewとかあればいいのにね。。。
chelsea
常連さん
会議室デビュー日: 2007/12/19
投稿数: 48
投稿日時: 2007-12-21 16:42


[ メッセージ編集済み 編集者: 未記入 編集日時 2007-12-21 16:43 ]
chelsea
常連さん
会議室デビュー日: 2007/12/19
投稿数: 48
投稿日時: 2007-12-21 16:54
引用:

burton999さんの書き込み (2007-12-21 16:26) より:
最終的にやりたいことは
・ボタンを押しても入力コントロールのフォーカスを維持したい。(テキストボックス、コンボボックス等)
・入力コントロール間のフォーカスは自由に移動したい。


まさしくその通りです。

burton999さん、まどかさん
先ほどburton999さんが提示してくれたコードで無事期待通りの動きができました。
実際の業務では確かにコントロールは増えますので、処理を共通化するためAddHandlerについてはまた調べてみます。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)