在asp.net里怎么跟据用户权限来生成树形菜单
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Microsoft.Web.UI.WebControls;
using System.Data.SqlClient;
namespace TreeCS
{
/// <summary>
/// WebForm1 的摘要说明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected Microsoft.Web.UI.WebControls.TreeView TreeView1;
private void Page_Load(object sender, System.EventArgs e)
{
// 定义数据库连接
SqlConnection CN = new SqlConnection();
try
{
//初始化连接字符串
CN.ConnectionString= "data source=pmserver;initial catalog=Benchmark;persist security info=False;user id=sa;Password=sa;";
CN.Open();
SqlDataAdapter adp = new SqlDataAdapter("select * from tbTree",CN);
DataSet ds=new DataSet();
adp.Fill(ds);
this.ViewState["ds"]=ds;
}
catch (Exception ex)
{
Session["Error"] = ex.ToString();
Response.Redirect("error.aspx"); //跳转程序的公共错误处理页面
}
finally
{
CN.Close();
}
//调用递归函数,完成树形结构的生成
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["ConText"].ToString();
TreeView1.Nodes.Add(Node);
Node.Expanded=true;
AddTree(Int32.Parse(Row["ID"].ToString()), Node); //再次递归
}
else
{ //添加当前节点的子节点
Node.Text = Row["ConText"].ToString();
pNode.Nodes.Add(Node);
Node.Expanded = true;
AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归
}
}
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
==================================================================
在SQL SERVER 2000中建表的脚本:
CREATE TABLE [dbo].[tbTree] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Context] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ParentID] [int] NULL ,
[depth] [int] NULL
) ON [PRIMARY]
这些内容比较简单,但是比较容易忘记。特写下来帮助记忆:(这里用的是TreeView和XmlDataSource绑定的例子)
第一种:对属性的值直接进行绑定。
首先 :拉一个TreeView到页面上,ID命名为"TrvLeft"。然后在后台进行绑定,
代码如下:
XmlDataSource XmlDb = new XmlDataSource();
XmlDb.DataFile = "Menu.xml";
trvLeft.DataSource = XmlDb;
TreeNodeBinding tnb = new TreeNodeBinding();
tnb.DataMember = "MenuItem";
tnb.TextField = "Text";
tnb.NavigateUrlField = "NavigateUrl";
tnb.ImageUrlField = "ImageUrl";
trvLeft.DataBindings.Add(tnb);
trvLeft.DataBind();
其中Menu.xml的内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<MenuItem Text="主菜单" NavigateUrl="Index.aspx" ImageUrl="main.gif">
<MenuItem Text="一级菜单" NavigateUrl="#" ImageUrl="Images/1.gif">
<MenuItem Text="二级菜单" NavigateUrl="#" ImageUrl="Images/1.gif"></MenuItem>
<MenuItem Text="二级菜单" NavigateUrl="#" ImageUrl="Images/1.gif"></MenuItem>
</MenuItem>
</MenuItem>
<MenuItem Text="主菜单" NavigateUrl="Index.aspx" ImageUrl="main.gif">
<MenuItem Text="一级菜单" NavigateUrl="#" ImageUrl="Images/1.gif">
<MenuItem Text="二级菜单" NavigateUrl="#" ImageUrl="Images/1.gif"></MenuItem>
<MenuItem Text="二级菜单" NavigateUrl="#" ImageUrl="Images/1.gif"></MenuItem>
</MenuItem>
</MenuItem>
第二种:递归树查询赋值:
public void Bind()
{
trvLeft.Nodes.Clear();
XmlDataSource xds = new XmlDataSource();
xds.DataFile = "Menu.xml";
XmlDocument xmlDocument = xds.GetXmlDocument();
//把根节点的东东和treeView实例根节点群丢进去递归
BindXmlToTreeView(xmlDocument.DocumentElement, trvLeft.Nodes);
}
public void BindXmlToTreeView(XmlNode node, TreeNodeCollection tnc)
{
//获得节点字段值
string text = ((XmlElement)node).GetAttribute("name");
string Value = node.Name;
tnc.Add(new TreeNode(text, Value));
foreach (XmlNode n in node.ChildNodes)
{
//指向子节点和父节点的子节点群
BindXmlToTreeView(n, tnc[tnc.Count - 1].ChildNodes);
}