- ベストアンサー
チェックボックスの操作方法について教えてください
- 前回ボタンクリックでチェックボックス768個をまとめてON/OFFするプログラムを作成しましたが、1個ずつ操作するプログラムを作りたいです。
- 前回のプログラムを参考にしましたが、想定した動作ができません。特にボタンクリック時のエラーに困っています。
- 初心者向けに分かりやすく説明していただけると助かります。ボタンクリックと同じ場所に飛ばすことが原因でエラーが発生していることは分かっています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
CheckBoxをButtonにキャストしようとしていることが原因のように思えます。 CheckBoxとButtonを50個ずつ生成し、同じイベントハンドラを共用するサンプルを書いてみたので参考にしてみてください。 CheckBoxの名前は CheckBox00, CheckBox01 ・・・としてあります。 Buttonの名前は Button00, Button01 ・・・としてあります。 Public Class Form1 Private ctlCheck As CheckBox() = {} Private ctlButton As Button() = {} Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Array.Resize(ctlCheck, 50) Array.Resize(ctlButton, 50) For i As Integer = 0 To 49 ' CheckBoxの作成 ctlCheck(i) = New CheckBox() ctlCheck(i).Name = "Check" + i.ToString("D2") ctlCheck(i).Text = i.ToString() ctlCheck(i).Location = New Point(4, i * 20) ctlCheck(i).Size = New Size(30, 18) ' Buttonの作成 ctlButton(i) = New Button() ctlButton(i).Name = "Button" + i.ToString("D2") ctlButton(i).Text = i.ToString() ctlButton(i).Location = New Point(80, i * 20) ctlButton(i).Size = New Size(30, 18) ' イベントハンドラの登録(Clickイベントを同じメソッドで) AddHandler ctlCheck(i).Click, AddressOf ControlClick AddHandler ctlButton(i).Click, AddressOf ControlClick Panel1.Controls.Add(ctlCheck(i)) Panel1.Controls.Add(ctlButton(i)) Next End Sub Private Sub ControlClick(ByVal sender As Object, ByVal e As EventArgs) ' コントロールの種類で振り分ける If TypeOf sender Is Button Then ' senderがButtonの場合 Select Case DirectCast(sender, Button).Name Case "" ' 割愛 End Select ElseIf TypeOf sender Is CheckBox Then ' senderがCheckBoxの場合 Select Case DirectCast(sender, CheckBox).Name Case "" ' 割愛 End Select End If ' または ' ButtonもCheckBoxもControlから派生しているので、ControlにキャストすればどちらでもNameを取れる Select Case DirectCast(sender, Control).Name Case "" ' 割愛 End Select End Sub End Class イベントハンドラをコントロールで分けるのであれば AddHandler ctlCheck(i).Click, AddressOf CheckBoxClick AddHandler ctlButton(i).Click, AddressOf ButtonClick として、CheckBocClickメソッドとButtonClickメソッドを用意してください。引数は上記サンプルのControlClickメソッドと同じです。
その他の回答 (1)
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
補足のコードを見る限り、a=0のときは bb = bb + 1 aa(x, a) = bb と bb = 0 の2種類に分かれるようですね。さらに、bb = 0とするのは常に定数のようなので、 If a = 0 Then Select Case x Case 8, ?, ?, ?, 1148 ' ←ここに bb = 0 にする定数をkカンマ区切りで並べる bb = 0 Case Else bb += 1 aa(x, a) = bb End Select End If といった具合にできると思います。次に、a = 1 については特定の値のときに cc = cc + 1 とし、すべてのパターンで aa(x, a) = cc が実施されるように見えます。 If a = 1 Then Select Case x Case 0, 10, ?, ?, ? cc += 1 End Select aa(x, a) = cc End If といった具合にできそうです。 条件判定はもっと複雑なのかもしれませんが全容が見えないのでご提示されたコードの範囲で考えてみました。 配列の上限値とループの上限値が異なるのが気になりますが、コピペミスですかね?(このまま動かすと配列限界を超えます) またこの処理がチェックボックスの変動とどのように関連するのかも不明です。どのようなことをしたいのか、が明確に教えてもらえればより解決に近い回答が得られると思いますよ。
お礼
ありがとうございました。 簡潔にまとめることができました。 本当にありがとうございました。 どのようなことをしたいのか、が明確に教えてもらえればより解決に近い回答が得られると思いますよ。 現在、I/Oボードのチェック用プログラムを作成しています。 1ボードに16個のポートがあり1個のポートに8個のOUTPUTが出来るので128個×6ボード分の768個のOUTPUTがありチェックボックスにチェックを入れるとポート番号と、OUTPUT番号がボードに送られてランプがつき チェックを外すとランプが消えるプログラムを作成しています。 これで基板の配線ミスやコードのつなぎ間違いなどをチェックします。 配列の上限値とループの上限値が異なるのが気になりますが、コピペミスですかね?(このまま動かすと配列限界を超えます) 私の勘違いでチェックボックスが768個ですがOUTPUT番号とポート番号と連動できるようにチェックボックスの名前の後ろに0,1,2,3,4,5,6,7,10,11,12,13,14,15,16,17,20,21,・・・・・・157, 200,201,202,203,204,・・・357,400,401・・・・,1157 と続けたのですが、番号数ではなくチェックボックスの数で配列の数を決めたので間違えてしまいました。
お礼
返事遅くなりすみません。 回答ありがとうございました。 いろいろと試してみましたが、コントロールを分けるのが一番ベストですね。 後現在、チェックボックスをクリックするとテーブルにより値が入るように考えたのですが、非常に不細工なものになってしまいました。 何かもう少し簡潔なテーブルの設定方法はないものでしょうか。 Dim aa(767, 1) As Integer Dim x As Short Dim a As Short Dim bb As Short Dim cc As Short bb = 0 cc = 0 For x = 0 To 1157 For a = 0 To 1 Select Case a Case 0 If x < 8 Then bb = bb + 1 aa(x, a) = bb ElseIf x < 18 Then If x > 9 Then bb = bb + 1 aa(x, a) = bb ElseIf x = 8 Then bb = 0 End If 省略 ElseIf x < 1158 Then If x > 1149 Then bb = bb + 1 aa(x, a) = bb ElseIf x = 1148 then bb = 0 End If End If Case 1 If x < 8 Then If x = 0 Then cc = cc + 1 End If aa(x, a) = cc ElseIf x < 18 Then If x > 9 Then If x = 10 Then cc = cc + 1 End If aa(x, a) = cc End If 以下省略 End If End Select Next Next