C#程序, Frame2.0框架。
基于TreeView控件的CheckBox。
实现功能:根据复选节点的平级节点情况修改父级节点情况并递归修改上一级父节点的复选情况;根据须复选节点的复选情况,自动修改子节点以及下一级子节点的复选情况。以下为代码原文(已生成控件,如要使用,直接继承即可)
算法原理:简单的递归,当存在父节点(子节点)的时候,递归调用本身进行判断。
作者的话:很简单的小功能,作为个人工作的备忘,也希望对看到的人能有一点帮助。谢谢你的阅读。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace TreeView_CheckBox_Examply
{
public partial class TreeView_AutoCheckBox : TreeView
{
public TreeView_AutoCheckBox()
{
InitializeComponent();
}
///
/// 只判断来自鼠标的命令,而不会和自动修改的状态修改命令混淆,而造成死循环
///
///
protected override void OnAfterCheck(TreeViewEventArgs e)
{
base.OnAfterCheck(e);
if (e.Action == TreeViewAction.ByMouse)
{
ChangeSubNodeCheckState(e.Node);
ChangeParentNodeCheckState(e.Node);
}
}
///
/// 当被复选的节点存在父节点的情况下,根据该节点的同级节点情况,
/// 决定是否改写父节点状态,同时递归向上判断父节点的父节点。
///
///
private void ChangeParentNodeCheckState(TreeNode e)
{
if (e.Parent != null)
{
switch (e.Checked)
{
case true:
bool childAllChecked = true;
foreach (TreeNode pTreeNode in e.Parent.Nodes)
{
if (pTreeNode.Checked == false)
childAllChecked = false;
}
if (childAllChecked)
{
e.Parent.Checked = true;
ChangeParentNodeCheckState(e.Parent);
}
break;
case false:
e.Parent.Checked = false;
ChangeParentNodeCheckState(e.Parent);
break;
default:
break;
}
}
}
///
/// 当复选的节点存在子节点的情况下,根据复选的节点的复选状态属性修改下级节点状态,
/// 如果下级节点还存在下级节点,递归修改。
///
///
private void ChangeSubNodeCheckState(TreeNode e)
{
if (e.Nodes != null)
{
foreach (TreeNode cTreedNode in e.Nodes)
{
if (e.Checked == true)
{
cTreedNode.Checked = true;
ChangeSubNodeCheckState(cTreedNode);
}
else
{
cTreedNode.Checked = false;
ChangeSubNodeCheckState(cTreedNode);
}
}
}
}
}
}