none
RadioButton.Textを取得したいのですが・・・ RRS feed

  • 質問

  •  

    VB2008Expで以下のような事をやりたいのですが

    ヘルプ等を見てもいまひとつ理解できずやり方もわからない状態です。

     

    やりたい事

       FormにGroupBoxを配置しその中にRadioButtonを3つ配置しました。

       配置したRadioButton.Textには

           RadioButton1.Text="A"

           RadioButton2.Text="B"

       RadioButton3.Text="C"  としました。

    デフォルトで"A"のRadioButtonにチェック入れています。

     

    ここで、"B"のRadioButtonをクリックしたときに

    MsgBoxで”Bがクリックされました。”

    または、"C"のRadioButtonをクリックしたときに

    MsgBoxで”Cがクリックされました。”

     

    と言うような動きをさせたいのです。

     

    そこで

     

    Private Sub RadioButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
                                                  Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged 

                            ,RadioButton3.CheckedChanged

           (ここに処理)
     End Sub

     

    を組立てれば良いだろう・・・まではわかるのですが

     

    実際 『(ここに処理)』 部がわかりません。

    if クリックされたRadioButtonのチェックがTrueなら

        msgbox(クリックされたRadioButton.Text)

    end if

    こんな感じなると思いますが 『クリックされたRadioButton』をどう判別してよいやら?

    『sender』をうまく使えばいいような気がするのですが・・・これもうまくいきません。

     

    どなたか助言をお願いいたします。

     

    2008年10月31日 7:25

回答

  • senderをCTypeでキャストすればそのクリックイベントを発生させたRadioButtonが得られます。 ちなみにCheckedChangedイベントをハンドルしているイベント名がRadioButton1_Clickというのはよくありません。紛らわしいです。

     

    2008年10月31日 7:52
    モデレータ

すべての返信

  • senderをCTypeでキャストすればそのクリックイベントを発生させたRadioButtonが得られます。 ちなみにCheckedChangedイベントをハンドルしているイベント名がRadioButton1_Clickというのはよくありません。紛らわしいです。

     

    2008年10月31日 7:52
    モデレータ
  • なるほどできました。

    ありがとうございます。

     

     trapemiya さんからの引用
    ちなみにCheckedChangedイベントをハンドルしているイベント名がRadioButton1_Clickというのはよくありません。紛らわしいです。

     

     

    これは新たな知識なりました。

    イベント名が『RadioButton_Click』でもOKなんですね。

     

     

    ちなみに

    この状態だとFormがLoadされた時点でも動いてしまいますよね?

    これを避ける方法ってあるのでしょうか?

    2008年10月31日 8:10
  •  ぽよってぃ さんからの引用

    イベント名が『RadioButton_Click』でもOKなんですね。

     

    イベントハンドラ名は何でもかまいません。

     

     ぽよってぃ さんからの引用

    この状態だとFormがLoadされた時点でも動いてしまいますよね?

    これを避ける方法ってあるのでしょうか?

     

    Handlesを使わず、フォームのLoadイベントでAddHandlerでイベントハンドラを作成するようにすればうまくいくと思います。

    2008年10月31日 8:53
    モデレータ
  •  trapemiya さんからの引用

    イベントハンドラ名は何でもかまいません。

     

    Handlesを使わず、フォームのLoadイベントでAddHandlerでイベントハンドラを作成するようにすればうまくいくと思います。

     

    これに正直戸惑っています。

    読んでの如く『イベント自体を作ってしまえ!!』って事ですよね?

    まだまだ頭の中が『???』だらけです。

     

    ありがとうございました。

    2008年11月4日 0:40
  • 外池と申します。『イベント自体を作ってしまえ!!』というご理解は、後々混乱すると思うので・・・、少々コメントさせてください。

     

    「イベント」というのは、「何かが起きたことを報せる」機能であることはご存知のとおりだと思いますが、「報せを発する機能」と、「報せを受け取る機能」とに分けることができます。「発する」機能は、今回の場合ですと、RadioButtonのコントロールが持っています。で、今回の場合に限れば、「発する」機能をいじったり、作ったりはしません。

     

    「受け取る」機能は、いくらで増やせます。FormにRadioButtonを貼り付けて、で、RadioButtonのイベントを選ぶと、RadioButton_hogehoge(sender as object, ...) Handles RadioButton.hogehoge というようなプロシージャーが自動的に生成されますが、これは「受け取る」機能を、とりあえず1つだけ、VBのエディターが自動的に用意してくれただけに過ぎません。

     

    ご自分で「受け取る」機能を増やすこともできます。RadioButtonのあるひとつのイベントの報せを、複数のプロシージャーで受け取ることも可能です。Handlesという句を用いて、プロシージャーとイベントの名前を連結して記述すれば、プログラムの稼動中、ずっと、そのプロシージャーはイベントを受け取り続けます。一方で、AddHandlerや、RemoveHandlerを使えば、プロシージャーのイベントの「受け取り」を、開始させたり、停止させたり、プログラムの中で制御することができます。

     

    こんな感じです。

     

    ちなみに、「発する」機能をいじったり、作ったりもできますよ? 『イベント自体を作ってしまえ!!』と表現すると、こっちのイメーじが強いような気もします。

     

    2008年11月4日 2:29
  • 外池さん

    追加コメントありがとうございます。

    まさに今、そこのHelpを読みながら頭を回転させてたところです。

    読めば読むほど『????』が増える一方ですが。

     

    もともとVB6でもこの手の動かし方ってあったのでしょうか?

    イベント自体は各コントロールに依存ですよね?

     

    Foam_Loadにイベント受けを作成した場合

    作った時点で動いてしまうような気がしますが・・・

    そもそも、その作り方すら考えている最中なんですが・・・

    2008年11月4日 2:55
  • 外池です。 (かなり書いたのに、エラーで記事が消えた OTZ )

     

    えっと・・・、VB6の場合、イベントを発する側と、イベントを受け取る側が、不可分に結びついていたと思います。で、「イベント自体は各コントロールに依存ですよね?」と仰っているのは、おそらく、イベントを「受け取る」側が、各コントロールに依存しているようなイメージをお持ちなのだと推察します。(実際、VB6はそんな感じでした。)

     

    で、VB.NETの場合は、イベントを発する側(これは各コントロール側のプログラムです)と、イベントを受け取る側は、まったくバラバラで独立で、積極的に両者を結びつける操作が必要です。VB.NETの場合、AddHandlerがあり、また、AddHandlerを自動的にやってくれるHandles句があります。厳密に言いますと、イベントを発生する側に、受け取るプロシージャーを登録するイメージになります。

     

    あるコントロールSomeControlの、あるイベントSomeEventがあるとします。これは、あくまで「発生側」です。

    一方、イベントを受け取りたいプロシージャーReceiver1、Receiver2と複数あるとします。何もしなければ、SomeControl.SomeEventとReceiver1、Receiver2はバラバラのままです。

    AddHandler SomeControl.SomeEvent AddressOf Receiver1

    と書くと、イベントを発する側のSomeControl.SomeEventに、Receiver1が登録されます。これ文の実行以降、Receiver1がイベントを受け取るようになります。さらに、

    AddHandler SomeControl.SomeEvent AddressOf Receiver2

    と書けば、同じイベントで、Receiver1もReceiver2もイベントを受け取るようになります。

     

    Receiver1の宣言で、

    Receiver1 Handles SomeControl.SomeEvent

    と書けば、固定的にReceiver1はイベントを受け取ってくれます。

    別の場所で、

    Receiver2 Handles SomeControl.SomeEvent

    と書けば、Receiver1もReceiver2も両方イベントを受け取ってくれます。

     

    特に、このHandlesを使った書き方ですが、自動的に文を作ってくれるのでなんとなくVB6時代と同じ仕組みに見えるのですが、文を作ってくれているのはエディターの機能であって、VBの仕組みではありません。

     

     

    2008年11月4日 4:31
  •  外池 さんからの引用

    外池です。 (かなり書いたのに、エラーで記事が消えた OTZ )

    ↑すみません。お手数おかけします。。

     

     外池 さんからの引用

    えっと・・・、VB6の場合、イベントを発する側と、イベントを受け取る側が、不可分に結びついていたと思います。で、「イベント自体は各コントロールに依存ですよね?」と仰っているのは、おそらく、イベントを「受け取る」側が、各コントロールに依存しているようなイメージをお持ちなのだと推察します。(実際、VB6はそんな感じでした。)

     

    その通です。

     

     外池 さんからの引用

    で、VB.NETの場合は、イベントを発する側(これは各コントロール側のプログラムです)と、イベントを受け取る側は、まったくバラバラで独立で、積極的に両者を結びつける操作が必要です。VB.NETの場合、AddHandlerがあり、また、AddHandlerを自動的にやってくれるHandles句があります。厳密に言いますと、イベントを発生する側に、受け取るプロシージャーを登録するイメージになります。

     

    あるコントロールSomeControlの、あるイベントSomeEventがあるとします。これは、あくまで「発生側」です。

    一方、イベントを受け取りたいプロシージャーReceiver1、Receiver2と複数あるとします。何もしなければ、SomeControl.SomeEventとReceiver1、Receiver2はバラバラのままです。

    AddHandler SomeControl.SomeEvent AddressOf Receiver1

    と書くと、イベントを発する側のSomeControl.SomeEventに、Receiver1が登録されます。これ文の実行以降、Receiver1がイベントを受け取るようになります。さらに、

    AddHandler SomeControl.SomeEvent AddressOf Receiver2

    と書けば、同じイベントで、Receiver1もReceiver2もイベントを受け取るようになります。

     

    Receiver1の宣言で、

    Receiver1 Handles SomeControl.SomeEvent

    と書けば、固定的にReceiver1はイベントを受け取ってくれます。

    別の場所で、

    Receiver2 Handles SomeControl.SomeEvent

    と書けば、Receiver1もReceiver2も両方イベントを受け取ってくれます。

     

    特に、このHandlesを使った書き方ですが、自動的に文を作ってくれるのでなんとなくVB6時代と同じ仕組みに見えるのですが、文を作ってくれているのはエディターの機能であって、VBの仕組みではありません。

     

    なるほどです。

    以前VB6で

           Privete Sub Text1Box_Click()

              (処理・・・)

           End Sub

     

    で必然的動くものがVB.Netでは

           Privete Sub Text1Box_Click()

              (処理・・・)

           End Sub

    では動かず

           Privete Sub Text1Box_Click()Handles Text1Box.Click

              (処理・・・)

           End Sub

    としないと駄目ってことですね^^       

     AddHandlerはどのように扱ったら良いかは勉強中ですが・・・

    2008年11月4日 8:58
  • 今回の質問はラジオボタンがクリックされたときの動作ですよね。

    ならば、AddHandlerを使わなくても

     

    Private Sub RadioButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
                                                  Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged 

                            ,RadioButton3.CheckedChanged

     

    のChechkedChangedをClickにしてしまえばよいのでは。

    2008年11月6日 19:44