チェックボックスのチェック状態を取得したいのですが

タグの編集
投稿者 大池  (社会人) 投稿日時 2009/8/25 22:56:50
いつもお世話になりありがとうございます。
・XPでVB2008 Express Editionを使っています。
・For Each 文でCheckBoxのチェック状態を取得したくつぎのように
したのですが、Checked プロパティが出てきません。このような場合は
どのようにすればいいのでしょうか?
ご教授のほどよろしくお願いいたします。

For Each ctr As Control In grpA.Controls
    If TypeOf ctr Is CheckBox Then
       ' Debug.Print(ctr.Name & "=" & ctr.Tag & ":" & ctr.Text)
      If ctr.Checked then ・・・と期待していました。  
    End If
Next
投稿者 よねKEN  (社会人) 投稿日時 2009/8/25 23:23:51
変数ctrはControl型ですのでCheckedプロパティを使うにはCheckBox型にキャストする必要があります。

For Each ctr As Control In grpA.Controls
    If TypeOf ctr Is CheckBox Then
    Dim chk As CheckBox = DirectCast(ctr, CheckBox)
      If chk.Checked then
          'チェックされていた場合の処理
       End If
    End If
Next 
投稿者 るしぇ  (社会人) 投稿日時 2009/8/25 23:49:59
コンパイル時は、コードで指定された情報に頼るしかないですからね。
実行時にはチェックボックスが入っているとしても、コード上で
Control 型なら、コントロールに共通したメンバしか表示されません。
だからこそ、よねKEN さん御紹介の型変換のコードがあります。

逆にコンパイルを通すだけなら、
For Each ctr As Control In grpA.Controls
    If TypeOf ctr Is Button Then
        Dim chk As CheckBox = DirectCast(ctr, CheckBox)
    End If
Next 

でも通ります。
ボタンだったらチェックボックスにする。。。
こんなバカなコードもバカ正直に命令どおり実行してくれます。

。。。で、実行時エラーと。
そんな仕組みになってます。なので型を意識したコーディングが
必要になります。
投稿者 大池  (社会人) 投稿日時 2009/8/26 06:08:50
よねKEN様
早速にご指導いただきましてありがとうございます。
るしぇ様
詳細な解説をいただきありがとうございます。
よねKEN様のプログラムを一段と深く理解することができました。
ご両人様ありがとうございました。今後ともよろしくお願いいたします。