2020年4月24日金曜日

VB CheckedListBox でチェック解除を拾う

CheckedListBox を使っていて、
どうも、sender や e を上手に利用出来ません。  と、再認識。  X(
単に、知識不足なのですが、
忘れない様に、コードと共に、書き残して置きましょう。


CheckedListBox は 使う側からすれば 便利な筈です。

でも、コードを書く側からすれば、
ListBox や CheckBox の様に、頻度が高い訳では無いでしょう。
ですから、
躓き躓き の コード書き になる訳ですが、
どうも、冒頭に書いた様に、
sender や e を上手に使いこなしていません!、 私の場合 ... 。

勿論、これって、
CheckedListBox に限った事ではありませんが ... 。


イベントハンドラーに渡される値。
これって、便利な筈ですが、
どうも、思考回路から抜け落ちて仕舞い勝ちなのです。


さて、懸案のコード。

CheckedListBox (CheckedListBox1) で、
チェックが外れた時に、
フィールド変数 (exceptItems) に項目名を追加する もの です。

プログラム内で、
或る条件で一部がチェックされた項目をリストするとします。
このチェック有無混在から、
ユーザーが手動でチェックを外したものを認識したいのです。

色々な方法が考えられると思いますが、
この方法が簡単な気がします。

    Private exceptItems As New List(Of String)     'CheckedListBox1 UnChecked

    Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck

        'Dim itemNow As String = Me.CheckedListBox1.Items(e.Index).ToString
        If e.NewValue Then  'Checked > Except Form exceptItems

            If exceptItems.Contains(Me.CheckedListBox1.Items(e.Index).ToString) Then
                exceptItems.Remove(Me.CheckedListBox1.Items(e.Index).ToString)
            End If

        Else                'UnChecked
            If Not exceptItems.Contains(Me.CheckedListBox1.Items(e.Index).ToString) Then
                exceptItems.Add(Me.CheckedListBox1.Items(e.Index).ToString)
            End If

            ' Not Support UnCheck
            ' e.NewValue = CheckState.Checked

        End If

    End Sub


新たなチェック追加には何も対応していません。
一度消して再び追加したもの のみ、対応しています。

Sub CheckedListBox1_ItemCheck の中で、
コメントアウト部分を活かせば、
チェック解除を無視も出来ます。


  その場合、なら、普通の ListBox で いいじゃん 、とも言えますけれど ... 。
  謂わば、 チェック部分は外れない 変な奴 ... 。  ;)



0 件のコメント:

コメントを投稿