权限管理 TreeView绑定数据

今天在做权限管理的时候对TreeView终于有所了解。在这里我所实现的是使用TreeView进行权限分配。

首先说一下TreeView的几个基本的属性

1.ID  获取或设置treeviewd的标识符

2.NodeIndent 获取或设置TreeView控件子节点的缩进量,该量是以像素为单位的

3.Nodes 获取TreeNode对象的集合(TreeNodeCollection)。该属性是只读的。

4.ShowCheckBoxex 是否显示复选框,有none,root,parent,leat,all五种,这里选择all

TreeNode:由于TreeView中的每一个节点都是一个TreeNode,所以事先也要对TreeNode有所了解

TreeNode的一般属性

1.Value  用于设置该节点保存的一个值,不显示

2.ImageUrl 该节点的图片路径

3.NavigateUrl 该节点的链接地址

4.Tex 该节点显示的内容

分配资源页面:根据把所有的资源绑定到TreeView中,但由于为要进行分配资源的角色已经拥有了部分资源,所以还要考虑到把该角色已经拥有的资源给选上钩。

数据库设计

sys_role    角色表

roleId 角色id

roleName  角色名称

sys_roleRight  角色-资源关系表

roleRightId

roleId   角色id

rightId 资源id

sys_right  资源表

rightId

node      节点

url         链接地址

image   图片地址

parentId    父节点id(   parentId = 0表示该节点为根节点)

remark      文字描述

下面进入正题

一、进入分配资源页面

      根据不同角色,选择分配资源链接。在链接中传入roleId标示所选择的角色,在AssigneRight.aspx页面中获取该roleId,并把它存储在ViewState中。

    //使用ViewState存储角色id

      private string RoleId
    {
        get { return Convert.ToString(ViewState["RoleId"]); }
        set { ViewState["RoleId"] = value; }
    }

   在页面加载时获取roleId,并绑定TreeView

   if (!IsPostBack)
        {
            string roleId = Request.QueryString["roleId"];
            if (!string.IsNullOrEmpty(roleId))
            {
                RoleId = roleId;

                调用Sys_roleManager的方法通过RoleId获取该条角色信息
                Sys_role role = Sys_roleManager.GetSys_roleByRoleId(Convert.ToInt32(RoleId));
                lblRoleName.Text += role.RoleName;

                //通过RoleId查询Sys_roleRight表获取该角色的角色-资源关系集合

                IList<Sys_roleRight> roleRights = Sys_roleRightManager.GetSys_roleRightsByRoleId(RoleId);
                // 使用Linq检索roleRights集合获取该角色所拥有的资源,并把它所拥有的资源存放到ViewState中

                Role_RightId = (from right in roleRights select right.RightId.ToString()).ToList();
            }
            //获取所有的根节点
            IList<Sys_right> rights = Sys_rightManager.GetSys_rightsByParentId(0);

            //绑定TreeView
            BindTreeView(rights);
        }

  

   private IList<Sys_right> Role_RightId

  {

          get{ return (IList<Sys_right>)ViewState["Role_RightId"]; }

          set{ViewState["Role_Right"] = value;}

   }

二、绑定TreeView

    上面说到使用BindTreeView(IList<Sys_right> rights)方法对TreeView进行数据绑定,下面就看一下对该方法的实现

    BindTreeView(IList<Sys_right> rights)方法中传入的参数为上面的rights集合,该集合中存放着所有的parentId=0的节点。

    在该方法中我们会对该集合进行循环遍历,遍历到其中一项时调用BindChildre(int parentId,TreeNode parentNode)方法绑定子节点

   #region 一般绑定TreeView的方法

    /// <summary>
    /// 绑定父节点
    /// </summary>
    /// <param name="rights">所有为父节点的集合</param>
     public void BindTreeView(IList<Sys_right> rights)
    {
        //循环遍历父节点集合
        foreach (var item in rights)
        {
            //创建父节点的TreeNode   
            TreeNode node = BindTreeNode(item);
            if (item.ParentId == 0)
            {
                //判断该节点是否被拥有,如果拥有则被选中
                if (role_RightId.Contains(item.RightId.ToString()))
                {
                    node.Checked = true;
                }
                //判读如果该节点为根节点,就调用分配子节点的方法BindChildren(int parentId,TreeNode parentNode)
                BindChildren(item.RightId, node);
                tvAssignRight.Nodes.Add(node);
            }
        }
    }


    /// <summary>
    /// 绑定子节点的方法
    /// </summary>
    /// <param name="parentId">父节点id</param>
    /// <param name="parendNode">父节点TreeNode</param>
    private void BindChildren(int parentId, TreeNode parendNode)
    {
        // 获取该父节点的所有子节点
        IList<Sys_right> childrenRight = Sys_rightManager.GetSys_rightsByParentId(parentId);
        //循环遍历所有的子节点
        foreach (var item in childrenRight)
        {
            //创建子节点对象,通过BindTreeNode(Sys_right right)方法为子节点绑定数据
            TreeNode childrenNode = BindTreeNode(item);
            if (role_RightId.Contains(item.RightId.ToString()))
            {
                childrenNode.Checked = true;
            }
            //递归调用BindChildren(int parentId,TreeNode parentNode)方法,以绑定该节点的所有子节点
            BindChildren(item.RightId, childrenNode);
            //把子节点添加到父节点中
            parendNode.ChildNodes.Add(childrenNode);
        }
    }
    #endregion

    /// <summary>
    /// 为TreeNode绑定数据
    /// </summary>
    /// <param name="right"></param>
    /// <returns></returns>
    private TreeNode BindTreeNode(Sys_right right)
    {
        TreeNode node = new TreeNode();
        node.Value = right.RightId.ToString();
        if (!string.IsNullOrEmpty(right.Image))
        {
            node.ImageUrl = "";
        }
        if (!(string.IsNullOrEmpty(right.Node)))
        {
            //node.NavigateUrl = right.Url;
        }
        if (!(string.IsNullOrEmpty(right.Remark)))
        {
            node.Text = right.Remark;
        }
        return node;
    }

三、分配资源

在分配资源页面中选择要分配资源右边的复选框,然后点击“确定按钮”  执行分配资源的方法。

在执行方法时会判断所选择的资源是否以及被该角色所拥有,如果以及拥有则不需要进行添加;除此之外还要判断该角色原来的资源有哪些要删除,把要删除的资源id存放到一个集合中

内容如下

        //获取所有选中的节点的集合,集合中存放TreeNode。集合的获取使用Cast<>对选中的节点进行类型转换

        IList<TreeNode> newRoleRights = (tvAssignRight.CheckedNodes.Cast<TreeNode>()).ToList();

        //使用linq获取newRoleRights集合中所有TreeNode的隐藏的value值,并把这些value值存放到newRights集合中
        IList<string> newRightIds = (from node in newRoleRights select node.Value.ToString()).ToList();


        //要进行删除的资源id集合    使用Except获取交集
        string[] deleteRightIds = role_RightId.Except(newRightIds).ToArray();

        //要进行添加的资源id集合
        string[] addRightIds = newRightIds.Except(role_RightId).ToArray();

        if (addRightIds.Length > 0)
        {
            //添加 角色-资源关系
            Sys_roleRightManager.AddSys_roleRightByRole(RoleId, addRightIds);
        }
        if (deleteRightIds.Length > 0)
        {
            //删除 角色-资源关系
            Sys_roleRightManager.DeleteSys_roleRightByRoleId(RoleId, deleteRightIds);
        }

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Vhero/archive/2010/03/04/5345771.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值