トップ回答者
RadioButton.Textを取得したいのですが・・・

質問
-
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』をうまく使えばいいような気がするのですが・・・これもうまくいきません。
どなたか助言をお願いいたします。
回答
すべての返信
-
外池と申します。『イベント自体を作ってしまえ!!』というご理解は、後々混乱すると思うので・・・、少々コメントさせてください。
「イベント」というのは、「何かが起きたことを報せる」機能であることはご存知のとおりだと思いますが、「報せを発する機能」と、「報せを受け取る機能」とに分けることができます。「発する」機能は、今回の場合ですと、RadioButtonのコントロールが持っています。で、今回の場合に限れば、「発する」機能をいじったり、作ったりはしません。
「受け取る」機能は、いくらで増やせます。FormにRadioButtonを貼り付けて、で、RadioButtonのイベントを選ぶと、RadioButton_hogehoge(sender as object, ...) Handles RadioButton.hogehoge というようなプロシージャーが自動的に生成されますが、これは「受け取る」機能を、とりあえず1つだけ、VBのエディターが自動的に用意してくれただけに過ぎません。
ご自分で「受け取る」機能を増やすこともできます。RadioButtonのあるひとつのイベントの報せを、複数のプロシージャーで受け取ることも可能です。Handlesという句を用いて、プロシージャーとイベントの名前を連結して記述すれば、プログラムの稼動中、ずっと、そのプロシージャーはイベントを受け取り続けます。一方で、AddHandlerや、RemoveHandlerを使えば、プロシージャーのイベントの「受け取り」を、開始させたり、停止させたり、プログラムの中で制御することができます。
こんな感じです。
ちなみに、「発する」機能をいじったり、作ったりもできますよ? 『イベント自体を作ってしまえ!!』と表現すると、こっちのイメーじが強いような気もします。
-
外池です。 (かなり書いたのに、エラーで記事が消えた 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の仕組みではありません。
-
外池 さんからの引用 外池です。 (かなり書いたのに、エラーで記事が消えた 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はどのように扱ったら良いかは勉強中ですが・・・
-