| ■No89121 (魔界の仮面弁士) に追記 > (案2) 1 つの List(Of ) 内に、すべての TabPage 上のチェックボックスを混在して格納するが、 > Label に表示する際に、どのページ上の CheckBox なのかを判断して集計させる。
案2 による実装例です。
Public Class Form1 Private checked As New List(Of CheckBox)()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'TabPage1 上にあると仮定 CheckBox1.Tag = 100 CheckBox2.Tag = 200 CheckBox3.Tag = 300 CheckBox4.Tag = 400 CheckBox5.Tag = 500
'TabPage2 上にあると仮定、以下同様 CheckBox6.Tag = 200 CheckBox7.Tag = 400 CheckBox8.Tag = 600 CheckBox9.Tag = 800 CheckBox10.Tag = 1000
'それぞれのタブページ上にある CheckBox をすべて列挙 For Each chk As CheckBox In TabControl1.TabPages.OfType(Of TabPage)().SelectMany(Function(p) p.Controls.OfType(Of CheckBox)())
'それぞれの CheckBox の CheckedChanged イベントに割り当て AddHandler chk.CheckedChanged, Sub(c As CheckBox, arg As EventArgs) If c.Checked Then checked.Add(c) Else checked.Remove(c) End If
UpdateFormula() 'Label を更新するための処理 End Sub Next
'別のタブが選択された場合も、Label の表示は切り替わる AddHandler TabControl1.SelectedIndexChanged, Sub() UpdateFormula() End Sub
'選択されている CheckBox を集計して Label に表示する処理 Private Sub UpdateFormula() Dim values = checked.Where(Function(o) o.Parent Is TabControl1.SelectedTab).Select(Function(o) o.Tag).ToArray() Dim total As Integer = values.Cast(Of Integer)().Sum() If total > 2000 Then Label1.Text = "2000を超えました" ElseIf total > 1000 Then Label1.Text = "1000を超えました" Else Label1.Text = "1000を超えていません" End If If values.Length = 0 Then Label2.Text = "" ElseIf values.Length = 1 Then Label2.Text = total.ToString("N0") Else Label2.Text = String.Join("+", values.Select(Function(v) String.Format("{0:N0}", v))) & "=" & total.ToString("N0") End If End Sub
End Class |