- PR -

[RadioButton] CheckedChangedイベントが2回走る

投稿者投稿内容
さえ
会議室デビュー日: 2008/10/24
投稿数: 10
投稿日時: 2008-11-08 07:30
■開発環境
Visual Basic 2008 Express Edition
VB.NET
Windows Application

■内容
フォームにラジオボタン3つを配置し、以下のようにその3つのCheckedChagedイベントを取得して処理を実装しています。

=====
Private Sub RadioButton_Changed(ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles rdbA.CheckedChanged, rdbB.CheckedChanged, rdbC.CheckedChanged
=====

ラジオボタンAが選択された状態でラジオボタンBを選択すると、それぞれのChangeイベントがハンドルされてしまい、このメソッドが2回走ってしまうことになります。
動作上の影響はありませんが、無駄な処理が走ることは避けたい為、何か回避方法をご存知でしたらご教授願えますでしょうか。

宜しくお願い致します。
もん吉
常連さん
会議室デビュー日: 2008/05/16
投稿数: 36
投稿日時: 2008-11-08 07:57
このイベントでどのような処理を実装しているのか分かりませんが
senderごとにオン/オフしたときの処理を切り分ければいいんじゃないでしょうか。
さえ
会議室デビュー日: 2008/10/24
投稿数: 10
投稿日時: 2008-11-08 09:47
引用:

もん吉さんの書き込み (2008-11-08 07:57) より:
このイベントでどのような処理を実装しているのか分かりませんが
senderごとにオン/オフしたときの処理を切り分ければいいんじゃないでしょうか。



早速のご回答有難う御座います。

このイベントでは、これらのラジオボタンでの検索結果を再表示するという処理を実施しています。

ですので、もん吉さんの仰る通りONのsenderをハンドルした時のみ再検索&再表示のロジックが処理されるようにすることで解決致しました。

=====
If sender.GetType.Name = "RadioButton" _
 AndAlso sender.checked = True Then
  Me.DataRefresh()
End If
=====

どうも有難う御座いました。
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-11-10 14:28
引用:

If sender.GetType.Name = "RadioButton" _
AndAlso sender.checked = True Then



本題と関係ありませんが、気になったので指摘しておきます。

1行目は RadioButton というクラスが他の名前空間にないとも限らない(現実的にはないんでしょうが)し、文字列に変換してから比較するとたぶん遅いと思います。

2行目の sender の checked は遅延バインディングで、これもパフォーマンスに影響します。Option Strict On だとコンパイルエラーになります。

一例ですが、私ならたぶんこう書きます。

コード:
Dim rb As RadioButton = TryCast(sender, RadioButton)
If rb IsNot Nothing AndAlso rb.Checked Then

さえ
会議室デビュー日: 2008/10/24
投稿数: 10
投稿日時: 2008-11-11 11:18
てってさん、ご指摘有難う御座います。
遅延バインディングはなるだけ避けた方がよいんですね。
きちんと型変換してから処理を行うよう意識します。

まだまだ未熟なのでこのようなご指摘もとても参考になります。
有難う御座いました。
もん吉
常連さん
会議室デビュー日: 2008/05/16
投稿数: 36
投稿日時: 2008-11-11 23:02
テッテさん、フォローありがとうございます。
その問題はスルーしてました(^^;

ちなみに私はTryCastではなくDirectCastをよく使ってます。
さえ
会議室デビュー日: 2008/10/24
投稿数: 10
投稿日時: 2008-11-12 01:44
引用:

ちなみに私はTryCastではなくDirectCastをよく使ってます。


もん吉さん、再び有難う御座います。
今回のケースはラジオボタン以外のコントロールもハンドルすることになりましたので、TryCastを使用しようと思います。

ラジオボタンのみしかハンドルしないケースだとDirectCastの方が良いんでしょうか。。
TryCastだと変換に失敗してもNothingを返してくれるので何も考えずにこっちばかり使ってしまいそうです。。。

[ メッセージ編集済み 編集者: さえ 編集日時 2008-11-12 01:45 ]
もん吉
常連さん
会議室デビュー日: 2008/05/16
投稿数: 36
投稿日時: 2008-11-12 08:39
引用:

もん吉さん、再び有難う御座います。
今回のケースはラジオボタン以外のコントロールもハンドルすることになりましたので、TryCastを使用しようと思います。

ラジオボタンのみしかハンドルしないケースだとDirectCastの方が良いんでしょうか。。
TryCastだと変換に失敗してもNothingを返してくれるので何も考えずにこっちばかり使ってしまいそうです。。。



このケースでDirectCastを使うとInvalidCastExceptionが発生するので
使えませんね。

完全にこの型しかありえないと分かっている前提であればDirectCastを使い
そうでなければTryCastを使う
という方針でいいと思います。

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