none
フォーカスをあてずにButtonを押下したい RRS feed

  • 質問

  • お世話になります。

    テキストボックスとボタンがあるだけの2つのフォーム(A、Bとします)があります。フォームAでは、"フォームBへ進むボタン"クリック時に画面遷移をしております。フォームBでは、"フォームAへ戻るボタン"をクリックできます。

    A→Bへの画面遷移時に、フォームBではフォームAのインスタンスを格納しており、戻る際には、そのインスタンスのShowメソッドを利用しています。

    やりたいことは、B→Aへ戻る際に、最後に入力したテキストボックスにフォーカスをあてた状態のフォームAを開くことです。現状では"フォームBに進むボタン"にフォーカスがあたったままになってしまいます。

    最後にフォーカスがあったテキストボックスにフラグを立てておくことなどを考えたのですが、もっと簡単に実現できないかと考えております。

    わかりにくい表現で申し訳ありませんが、お知恵を拝借したく投稿いたしました。よろしくお願い致します。

    2006年5月9日 12:22

回答

  • 申し訳ありません。勘違いしている部分がありました。

    Buttonを継承したクラスのコンストラクタ内でSetStyleメソッドを呼び出して実現できました。

    コメントを下さった皆様、ありがとうございました。
    2006年5月12日 7:31

すべての返信

  • 最後のテキストボックスをフォーカスを設定します。

    .Showしなければ設定できないような気はしますが、

    ※frmBのAボタンへ処理

    frmA.Show()
    frmA.SetFocus()  'もちろん独自処理

    ※frm.SetFocus()処理で

    me.FinalTextBox.Focus()

    ※全部のフォーカス取得イベント

    me.FinalTextBox = DirectCast(TextBox, sender)

    2006年5月9日 12:51
  • ざっと思いついたものです。VB.NETは普段かかないので良いコードじゃないかも(^^;
    
    Public Class FormA
        Private focusCtr As Control = Nothing
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim form As New FormB(Me)
            form.Show()
        End Sub
    
        Private Sub FormA_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            For Each ctr As Control In Me.Controls
                If Not TypeOf ctr Is Button Then
                    AddHandler ctr.GotFocus, AddressOf ctr_GotFocus
                End If
            Next
        End Sub
    
        Private Sub ctr_GotFocus(ByVal sender As Object, ByVal e As EventArgs)
            focusCtr = CType(sender, Control)
        End Sub
    
        Private Sub FormA_Activated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Activated
            If Not focusCtr Is Nothing Then
                focusCtr.Focus()
            End If
        End Sub
    End Class
    
    
    2006年5月9日 15:35
    モデレータ
  • あっ、上のコードでGotFocusじゃなくて、Enterイベントの方がいいですね。VB.NETのサンプル探してたらたまたまGotFocusがあったんで、そのまま使っちゃいました。(^^;

    #上のコード編集するとまた日本語が化けるので、とりあえずそのままです。GotFocusを使った悪い例としてw

    2006年5月9日 15:43
    モデレータ
  •  BlueOcean さんからの引用

    やりたいことは、B→Aへ戻る際に、最後に入力したテキストボックスにフォーカスをあてた状態のフォームAを開くことです。現状では"フォームBに進むボタン"にフォーカスがあたったままになってしまいます。

    不都合が無ければ、ControlStyles.SelectableがFalseなButtonを作るとか。
    2006年5月9日 21:46
  • 「全部のフォーカス取得イベントなし」案として、
    UpdateDefaultButton で最後のコントロールを記録する。

    2006年5月9日 23:22
  • ご回答ありがとうございました。また、返信が遅くなり申し訳ありません。

     

    できれば、ボタンの中でのみ処理を行ないたいと思いましたので、辛島さんが教えて下さったように、Buttonを継承したクラス(ユーザーコントロール)を作成し、そのクラスのNew( )の中でSetStyle(ControlStyles.Selectable, False)を実行しました。

     

    しかし、ボタンクリック時にフォーカスがあたってしまいます。上記設定方法がおかしいのでしょうか。ご教授いただけると幸いです。よろしくお願い致します。

     

    2006年5月10日 8:52
  •  BlueOcean さんからの引用
    しかし、ボタンクリック時にフォーカスがあたってしまいます。上記設定方法がおかしいのでしょうか。ご教授いただけると幸いです。よろしくお願い致します。

    普通に、フォーカスは当たると思いますよ。
    ComboBox なども同様です。

    2006年5月10日 10:58
  • >しかし、ボタンクリック時にフォーカスがあたってしまいます。上記設定方法がおかしいのでしょうか

    試してみましたが、うまく行きましたよ。ボタンを押してもフォーカスはテキストボックスに残ったままでした。
    ただし、ユーザーコントロールにしてませんし、まだ仕事中なんで、手っ取り早く得意なC#の方で試しましたが。(^^;

    2006年5月10日 12:44
    モデレータ
  • 申し訳ありません。勘違いしている部分がありました。

    Buttonを継承したクラスのコンストラクタ内でSetStyleメソッドを呼び出して実現できました。

    コメントを下さった皆様、ありがとうございました。
    2006年5月12日 7:31