【C#】【VB.NET】CheckedListBoxがチェックされたときにイベントを発生させる

f:id:ktts:20190909225940p:plain

CheckedListBoxのチェック状態が変わったときにItemCheckイベントが発生するんですが、
チェック状態が更新されていないのでItemCheckEventArgsを調べなくてはいけません。
面倒なので簡便な手法がないか調べたところ、
遅延実行を利用するのがシンプルだったので手法をメモします。

参考サイト
stackoverflow.com

C#の場合

/// <summary>
/// checkedListBox1のItemCheckイベントハンドラー
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CheckedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    // チェックされた項目を表示する
    BeginInvoke(new Action(DisplayCheckedItems));
}

/// <summary>
/// TextBoxにチェックされた項目を表示します
/// </summary>
private void DisplayCheckedItems()
{
    StringBuilder stringBuilder = new StringBuilder();

    for (int i = 0; i < checkedListBox1.Items.Count; i++)
    {
        if (checkedListBox1.GetItemChecked(i))
        {
            stringBuilder.AppendLine($"{checkedListBox1.Items[i].ToString()}がチェックされました");
        }
    }

    textBox1.Text = stringBuilder.ToString();
}

VB.NETの場合

''' <summary>
''' CheckedListBox1のItemCheckイベントハンドラー
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
    ' チェックされた項目を表示する
    BeginInvoke(New Action(AddressOf DisplayCheckedItems))
End Sub

''' <summary>
''' TextBoxにチェックされた項目を表示します
''' </summary>
Private Sub DisplayCheckedItems()
    Dim stringBuilder As New Text.StringBuilder()

    For index = 0 To CheckedListBox1.Items.Count - 1
        If CheckedListBox1.GetItemChecked(index) Then
            stringBuilder.AppendLine($"{CheckedListBox1.Items(index).ToString()}がチェックされました")
        End If
    Next

    TextBox1.Text = stringBuilder.ToString()
End Sub