CheckBox树型结构功能选择是权限管理经常用到的一个功能。 对CheckBox的选择控制以前的方法有JavaScript。本文的方法为asp.net下的编程实现。
流程:
1 节点状态发生变化
2 设置其下节点的变化
3 设置其节点父节点的变化。这个只需要设置该节点选中的情况。如果没有选中当该节点没有兄弟节点时有部分关系,需要去除父节点的选中状态。但是这个对程序没什么大的影响。所以没有写。
节点复选框发生变化触发如下事件:
protected void TreeViewFuncList_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
// 修改所选节点的 同时选择其子节点状态
SetChildChecked(e.Node);
}
/// <summary>
/// 当节点被选中 同时选择其父节点被选中 没选中则不改变
/// </summary>
/// <param name="p_Node"></param>
private void SetChildChecked(TreeNode p_Node)
{
// 当节点被选中 同时选择其父节点被选中 没选中则不改变
if (p_Node.Checked)
{
SetParentChecked(p_Node);
}
foreach (TreeNode _n in p_Node.ChildNodes)
{
_n.Checked = p_Node.Checked;
// 递归调用
if (_n.ChildNodes.Count > 0)
{
SetChildChecked(_n);
}
}
}
/// <summary>
/// 选择此节点位置前的父节点为选中状态 直到根节点位置
/// </summary>
/// <param name="p_Node">树节点</param>
private void SetParentChecked(TreeNode p_Node)
{
/** 节点所在位置的深度 */
int i = p_Node.Depth;
/** 临时节点 用来进行交换保存临时变量 */
TreeNode tempNode;
/** 选择此节点位置前的父节点为选中状态 直到根节点位置 */
while (i>0)
{
tempNode = p_Node;
tempNode.Parent.Checked = tempNode.Checked;
p_Node = tempNode.Parent;
// 节点深度减1
i--;
}
}
通过上面的函数,我们可以完成CheckBox的选择了。如果要引用其值可以通过获取Value得到。
设置节点的Value:Node.Value = Row["FunctionId"].ToString();
获取值:TreeViewFuncList.SelectedNode.Value;
测试通过