2024年6月2日发(作者:)

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

行权限分配

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

获取或设置treeviewd的标识符

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

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

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

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

所了解

TreeNode的一般属性

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

rl 该节点的图片路径

teUrl 该节点的链接地址

该节点显示的内容

分配资源页面:根据把所有的资源绑定到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标示所选择的角色,在

页面中获取该roleId,并把它存储在ViewState中。

//使用ViewState存储角色id

private string RoleId

{

get { return ng(ViewState["RoleId"]); }

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

}

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

if (!IsPostBack)

{

string roleId = tring["roleId"];

if (!OrEmpty(roleId))

{

RoleId = roleId;

调用Sys_roleManager的方法通过RoleId获取该条角色信息

Sys_role role

Sys__roleByRoleId(32(RoleId));

+= me;

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

IList

Sys__roleRightsByRoleId(RoleId);

// 使用Linq检索roleRights集合获取该角色所拥有的资源,并把它所拥有

的资源存放到ViewState中

Role_RightId = (from right in roleRights select ng()).ToList();

}

//获取所有的根节点

IList rights = Sys__rightsByParentId(0);

//绑定TreeView

BindTreeView(rights);

}

private IList Role_RightId

{

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

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

}

二、绑定TreeView

上面说到使用BindTreeView(IList rights)方法对TreeView进行数据绑定,下面

就看一下对该方法的实现

BindTreeView(IList rights)方法中传入的参数为上面的rights集合,该集合中存

放着所有的parentId=0的节点。

在该方法中我们会对该集合进行循环遍历,遍历到其中一项时调用BindChildre(int

parentId,TreeNode parentNode)方法绑定子节点

#region 一般绑定TreeView的方法

///

/// 绑定父节点

///

/// 所有为父节点的集合

public void BindTreeView(IList rights)

{

//循环遍历父节点集合

foreach (var item in rights)

{

//创建父节点的TreeNode

TreeNode node = BindTreeNode(item);

roleRights =

=

if (Id == 0)

{

//判断该节点是否被拥有,如果拥有则被选中

if (role_ns(ng()))

{

d = true;

}

//判读如果该节点为根节点,就调用分配子节点的方法BindChildren(int

parentId,TreeNode parentNode)

BindChildren(d, node);

(node);

}

}

}

///

/// 绑定子节点的方法

///

/// 父节点id

/// 父节点TreeNode

private void BindChildren(int parentId, TreeNode parendNode)

{

// 获取该父节点的所有子节点

IList childrenRight = Sys__rightsByParentId(parentId);

//循环遍历所有的子节点

foreach (var item in childrenRight)

{

//创建子节点对象,通过BindTreeNode(Sys_right right)方法为子节点绑定数据

TreeNode childrenNode = BindTreeNode(item);

if (role_ns(ng()))

{

d = true;

}

//递归调用BindChildren(int parentId,TreeNode parentNode)方法,以绑定该节点

的所有子节点

BindChildren(d, childrenNode);

//把子节点添加到父节点中

(childrenNode);

}

}

#endregion

///

/// 为TreeNode绑定数据

///

///

///

private TreeNode BindTreeNode(Sys_right right)

{

TreeNode node = new TreeNode();

= ng();

if (!OrEmpty())

{

rl = "";

}

if (!(OrEmpty()))

{

//teUrl = ;

}

if (!(OrEmpty()))

{

= ;

}

return node;

}

三、分配资源

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

方法。

在执行方法时会判断所选择的资源是否以及被该角色所拥有,如果以及拥有则不需要进行添

加;除此之外还要判断该角色原来的资源有哪些要删除,把要删除的资源id存放到一个集

合中

内容如下

//获取所有选中的节点的集合,集合中存放TreeNode。集合的获取使用Cast<>对选

中的节点进行类型转换

IList newRoleRights

(()).ToList();

=

//使用linq获取newRoleRights集合中所有TreeNode的隐藏的value值,并把这些

value值存放到newRights集合中

IList newRightIds

ng()).ToList();

= (from node in newRoleRights select

//要进行删除的资源id集合 使用Except获取交集

string[] deleteRightIds = role_(newRightIds).ToArray();

//要进行添加的资源id集合

string[] addRightIds = (role_RightId).ToArray();

if ( > 0)

{

//添加 角色-资源关系

Sys__roleRightByRole(RoleId, addRightIds);

}

if ( > 0)

{

//删除 角色-资源关系

Sys_Sys_roleRightByRoleId(RoleId, deleteRightIds);

}