利用Treeview做权限树的一种方法

在B/S结构中,用Treeview做权限这一部分是很直观的一个办法。假设有一棵权限树来给某用户分配权限,勾选中的一些节点保存下来,当用户登陆时再根据数据库生成一棵子权限树。下面写的便是生成子树的一种方法。
假设父权限树已经生成(具体数据表结构请参照上一篇《递归实现无限级树》);假设已经在父树上启用了checkbox,并且以“节点ID.节点ID.节点ID.节点ID.”这种方式保存具有权限的节点。
再假设用户表是这样的:

create   table  tab_user
(
    ID 
int   Identity ( 1 , 1 primary   key ,
    
[ user_name ]   varchar ( 20 not   null ,
    
[ user_pwd ]   varchar ( 20 not   null ,
    
[ user_grant ]   varchar ( 50
        
-- 保存权限的字段。视权限项目的多少修改长度
)
go

insert   into  tab_user ( [ user_name ] , [ user_pwd ] , [ user_grant ] values ( ' jeff ' , ' 123 ' , ' 1.4.10.7.8. ' )
    
-- 假设已经分配了权限,保存的是树的节点的value
go

页面上放一Treeview1,代码如下
using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;
using  System.Data.SqlClient;

public  partial  class  treeview2 : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        SqlConnection myConn 
= new SqlConnection("user id=sa;password=123;Database =test;data source=jeff;");
        
try
        
{
            
//初始化连接字符串
            
            SqlDataAdapter myAdapter 
= new SqlDataAdapter("select * from menu order by parentID ", myConn); ;
            DataSet ds 
= new DataSet();
            myAdapter.Fill(ds);
            
this.ViewState["ds"= ds;
        }

        
catch (Exception ex)
        
{
            Session[
"Error"= ex.ToString();
            
        }

        
finally
        
{
            myConn.Close();
        }

        
//调用递归函数,完成树形结构的生成
        if (!IsPostBack)
        
{
            AddTree(
0, (TreeNode)null);
        }


    }



    
//递归添加树的节点
    public void AddTree(int ParentID, TreeNode pNode)
    
{
        DataSet ds 
= (DataSet)this.ViewState["ds"];
        DataView dvTree 
= new DataView(ds.Tables[0]);
        
        
//过滤ParentID,得到当前的所有子节点
        dvTree.RowFilter = "[PARENTID] = " + ParentID;
         
        
foreach (DataRowView Row in dvTree)
        
{
            TreeNode Node 
= new TreeNode();
            
if (pNode == null)
            
{    //添加根节点
                Node.Text = Row["Title"].ToString();
                Node.Value 
= Row["ID"].ToString();
                Node.NavigateUrl 
= Row["url"].ToString();
                Node.ToolTip 
= Row["description"].ToString();
                TreeView1.Nodes.Add(Node);
                Node.Expanded 
= true;
                AddTree(Int32.Parse(Row[
"ID"].ToString()), Node);        //再次递归
            }

            
else
            
{   //̀添加当前节点的子节点
                Node.Text = Row["Title"].ToString();
                Node.Value 
= Row["ID"].ToString();
                Node.NavigateUrl 
= Row["url"].ToString();
                Node.ToolTip 
= Row["description"].ToString();
                
                pNode.ChildNodes.Add(Node);
                Node.Expanded 
= true;
                AddTree(Int32.Parse(Row[
"ID"].ToString()), Node);     //再次递归
            }


        }

    }


    
protected void btnGrant_Click(object sender, EventArgs e)//保存权限
    {
        
string strGrant="";
        
string strComm = "";
        
foreach (TreeNode cnode in TreeView1.CheckedNodes)
        
{
            
//Response.Write(cnode.Text + "的父节点是" + cnode.Parent.Text + "<br/>");
            strGrant = strGrant + cnode.Value + ".";
        }

        
//Response.Write(strGrant);
        strComm = "update tab_user set user_Grant='"+ strGrant +"' where user_name='jeff'";
        SqlConnection myConn 
= new SqlConnection("user id=sa;password=123;Database =test;data source=jeff;");
        myConn.Open();
        SqlCommand myComm 
= new SqlCommand(strComm,myConn );
        myComm.ExecuteNonQuery();
        myConn.Close();
    }


   
}

http://jeffamy.cnblogs.com/archive/2006/03/24/357742.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值