今天在做权限管理的时候对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