【C#】チェックボックス付きTreeViewで子ノードと親ノードの状態を一致させる

C#

チェックボックスを表示するTreeViewにおいてノードに階層構造を持たせる場合に、親ノードのチェックボックスをONしたら、子ノードのチェックボックスも同期してONしたい場合があります。

本記事では、チェックボックス付きTreeViewで子ノードと親ノードの状態を一致させるサンプルコードを紹介します。

できること

・チェックボックス付きTreeViewで子ノードと親ノードの状態を一致

・親ノードのチェックボックスをダブルクリックしたとき、親と子のチェック状態が不一致になる現象の対策

サンプルコード

TreeViewを継承したクラスを作成してビルド。成功するとツールボックスにTreeViewCBが表示されるので、フォームに配置して使用します。namespaceは自身の環境に合わせて変更してください。

バグ等含まれている可能性ありますので、ご自身でデバッグをお願いします。

using System.Windows.Forms;

namespace TreeViewCheckBox
{
    class TreeViewCB : TreeView
    {
        // ダブルクリック時のメッセージ
        const int WM_LBUTTONDBLCLK = 0x0203;

        // Windowsメッセージを処理
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_LBUTTONDBLCLK)
            {
                // 親ノードと子ノードのチェック状態がずれる現象の対策。
                // ダブルクリック時は何もしない。
            }
            else
            {
                // 上記意外は通常のメッセージ処理
                base.WndProc(ref m);
            }
        }

        // チェックボックスの再起処理
        private void SetCheckBox(TreeNodeCollection nodes, bool newStatus)
        {
            foreach (TreeNode node in nodes)
            {
                node.Checked = newStatus;
                SetCheckBox(node.Nodes, node.Checked);
            }
        }

        // チェック後処理
        protected override void OnAfterCheck(TreeViewEventArgs e)
        {
            base.OnAfterCheck(e);

            // チェック状態は子ノードにも反映
            SetCheckBox(e.Node.Nodes, e.Node.Checked);
        }
    }
}

まとめ

本記事では、チェックボックス付きTreeViewで子ノードと親ノードの状態を一致させる方法を紹介しました。

タイトルとURLをコピーしました