|
■No77117 (まあさ さん) に返信 > ここの処理の書き方が解りません
chkA では pnlA を chkB では pnlB を chkC では pnlC を操作したいのですよね。
chk* は CheckBox だとして、 pnl* は Panel でしょうか? とりあえず Control 継承クラスと仮定して回答します。
' (案1) 各CheckBox の Tag プロパティに、操作対象のオブジェクトをセットしておく
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load chkA.Tag = pnlA chkB.Tag = pnlB chkC.Tag = pnlC End Sub
Private Sub CheckBoxes_CheckedChanged(sender As Object, e As EventArgs) _ Handles chkA.CheckedChanged, chkB.CheckedChanged, chkC.CheckedChanged
Dim chk = DirectCast(sender, CheckBox) Dim pnl = TryCast(chk.Tag, Control) If pnl IsNot Nothing Then pnl.Enabled = chk.Checked End If End Sub
End Class
' (案2) CheckBox と、操作対象のオブジェクトの組み合わせを管理するコレクションを用意
Public Class Form1 Private dicChkPnl As New Dictionary(Of CheckBox, Control)()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load '最初に、chk と pnl の組み合わせを登録しておく dicChkPnl.Add(chkA, pnlA) dicChkPnl.Add(chkB, pnlB) dicChkPnl.Add(chkC, pnlC)
'Checked に連動するよう、イベントを動的割当 For Each entry In dicChkPnl Dim chk = entry.Key Dim pnl = entry.Value AddHandler entry.Key.CheckedChanged, Sub() pnl.Enabled = chk.Checked If pnl.Enabled <> chk.Checked Then pnl.Enabled = chk.Checked Next End Sub End Class
' (案3) コントロールの名前を通じて捜索 ※若干低速です
Public Class Form1 Private Sub CheckBoxes_CheckedChanged(sender As Object, e As EventArgs) _ Handles chkA.CheckedChanged, chkB.CheckedChanged, chkC.CheckedChanged
Dim chk = DirectCast(sender, CheckBox) Dim sName As String = "pnl" & chk.Name.Substring(3) Me.Controls.Find(sName, True).First().Enabled = chk.Checked End Sub End Class
|