チェック付きリストボックスのチェックと、全選択用のチェックボックスのチェックを連動させる

Visual Studio C# コントロール
  1. 個別にチェックできる複数の項目を持つチェック付きリストボックス
  2. a.の全項目のチェック ON / OFF を一括で行うためのチェックボックス
    動作
  1. b にチェックを付けると、a の全てにチェックが付く
  2. b のチェックを外すと、a の全てのチェックが外れる
  3. a の全てのチェックが外れていると、b のチェックも外れる
  4. a の全てにチェックを付けると、b もチェックが付く
  5. a に 1 つ以上かつ全選択未満のチェックが付いていると、b は中間状態になる
  6. b を直接操作しても、b は中間状態にはならない

web 上で似たような動作を実現している例があったので、動作イメージの参考に
【JavaScript】チェックボックスを全選択/全解除する
[jQuery] 全選択・全解除チェックボックスの実装
どちらとも VS C# ではないが、要はこれと同じような動作を行いたい(ただ、こちらの記事のサンプルでは中間状態にならないので、今回のケースはより複雑)

11.すべての項目を選択解除する
動作 1. 2. の全選択・全解除はこちらを参考にチェックボックスの ON / OFF に合わせてメソッドを実行

問題は動作 3. 以降で、何も考えないと相互にイベントを発生させ合ってしまう
 a,b それぞれのチェック状態が変わったイベントをキャッチしてそれぞれでお互いを操作する処理を書いてしまうと、交互にイベントが発生し続ける無限ループ状態に陥る危険が
 実際にやってみたら無限ループにはならなかったものの、相互にイベントを発生させる現象自体は発生したので、b から一括操作 1,2 を実行したときは動作 3,4,5 を実行しないように管理用のフラグを追加して対応

もう一つ問題があって、チェック付きリストボックスの ItemCheck イベントが発生した時点ではチェックの状態が変わっていない
 動作 3,4,5 を実現するためには a のチェック数を取得する必要があるが、ItemCheck イベントをキャッチした時に CheckedItems.Count でチェック数を取得しようとしても、変更前のチェック数しか取得できない
 ItemCheckEventArgs には変更があった項目のインデックスと変更前後の値が入っているので、今回はこれを調べて CheckedItems.Count の数に ±1 することで対応した

ちなみに今回は採用しなかったが、遅延実行を利用することで CheckedItems.Count から変更後の値を取得することもできる
【C#】【VB.NET】CheckedListBoxがチェックされたときにイベントを発生させる

0 件のコメント:

コメントを投稿