チェックボックスを表示する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で子ノードと親ノードの状態を一致させる方法を紹介しました。