■64927 / ) |
Re[1]: vb.netでのチェックボックスについて |
□投稿者/ 魔界の仮面弁士 (123回)-(2013/01/22(Tue) 19:00:02)
|
2013/01/22(Tue) 19:05:15 編集(投稿者)
■No64924 (don さん) に返信 > ラジオボタンであればと思うかもしれませんが、チェックボックスである理由は、 > ユーザーが選択(チェック)した後、無選択に戻せないからです。
やろうと思えばできないこともありません。
RadioButton や CheckBox では「AutoCheck プロパティを False にする」ことで、 On/Off の切り替えをすべてプログラム制御で行わせることができるためです。
使うイベントも変わってしまいますし、コーディング量も増えるので 使いどころは限られますが、一応、そういう方法もあるということで。
> CheckBox1をクリックしチェックを入れた後、CheckBox2をクリックすると、 > CheckBox1のチェックは外れましたが、CheckBox2にチェックが入りませんでした。
『ステップ実行』してみるとわかるかと思いますが、 CheckedChanged イベントが発生するのは、クリック時だけではありません。 プログラムから Checked プロパティを変更した場合にも発生します。 On に変更した時にも発生しますし、Off になるときにも発生します。
すなわち今回の場合、下記のような動作となっていたわけです。
★ 1 と 2 が Off のときに、ユーザーが 1 をクリックした。 ・1 の AutoCheck は True のため、1 が On 状態となる。 ・この操作により 1 の変更イベントが発生し、2 を Off にするが、 2 はすでに Off のため、2 の変更イベントは発生しない。 ・この結果、CheckBox1 は On、CheckBox2 は Off になる。
★ 1 が On、2 が Off のときに、ユーザーが 2 をクリックした。
・2 の AutoCheck は True のため、2 が On 状態となる。 ・この操作により 2 の変更イベントが発生し、1 を Off にする。 1 は On になっているため、1 の変更イベントが発生する。 ・1 の変更イベントにより、2 が Off に戻される。これにより 2 の状態が変わることになり、再度 2 の変更イベントが発生する。 ・2 の変更イベントにより、1 を Off にするが、そもそも すでに 1 は Off であるため、1 の変更イベントは発生しない。 ・この結果、CheckBox1 と CheckBox2 の両方が Off になる。
> 「System.StackOverflowException' のハンドルされていない例外が発生」とあり > 怒られました・・・。
イベントが連鎖的に無限に発生するためです。 そのため、プログラムによる Checked プロパティ変更時は、 何かフィールド変数などでフラグ判定を行うなどして、 ユーザー操作による変更と区別するようにしてみてください。
|
|