.net之旅-CheckBox树型结构功能选择(43)

时间:2020-12-14 13:01:02

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;

测试通过