|
■No89122 (魔界の仮面弁士) に追記 > '別のタブが選択された場合も、Label の表示は切り替わる > AddHandler TabControl1.SelectedIndexChanged, Sub() UpdateFormula()
ここまでの例では AddHandler を用いて、Load イベント内で動的にイベントハンドラを割り当てていますが、 慣れていなければ AddHandler は用いず、Handles 句による通常のイベント割り当て構文を利用しても構いません。
つまり上記の AddHandler の代わりに、こういうコードを使うという事です。
Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged UpdateFormula() End Sub
そしてこれは、CheckBox に対しても言えます。
Load イベントにて、.Controls.OfType(Of ) で列挙して AddHandler していくのも、 あらかじめ事前に Handles 句で割り当てておくのも、最終的には同じ結果が得られます。
Public Class Form1
Private checked As New List(Of CheckBox)()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load CheckBox1.Tag = 100 CheckBox2.Tag = 200 CheckBox3.Tag = 300 CheckBox4.Tag = 400 CheckBox5.Tag = 500 CheckBox6.Tag = 200 CheckBox7.Tag = 400 CheckBox8.Tag = 600 CheckBox9.Tag = 800 : : CheckBox500.Tag = 1000 End Sub
Private Sub CheckBoxes_CheckedChanged(sender As CheckBox, e As EventArgs) Handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged, CheckBox3.CheckedChanged, ……, CheckBox500.CheckedChanged If sender.Checked Then checked.Add(sender) Else checked.Remove(sender) End If UpdateFormula() End Sub
Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged UpdateFormula() End Sub
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
|