Asp.net用递归方式显示TreeView Web控件的代码

代码说明:

表T_HG_Catalog的脚本:
CREATE TABLE [T_hg_catalog] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Catalog_name] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Parent_ID] [int] NULL ,
[Remark] [varchar] (128) COLLATE Chinese_PRC_CI_AS NULL ,
[State] [smallint] NOT NULL CONSTRAINT [DF_T_hg_catalog_State] DEFAULT (0),
CONSTRAINT [PK_t_hg_catalog] PRIMARY KEY CLUSTERED
(
[ID]
) ON [PRIMARY]
) ON [PRIMARY]
GO

其中,一条类别记录如果有上一级类别,则Parent_ID='上级类别ID',如果是最高级,没有上级类别Parent_ID=NULL

CheckPermitFromTable函数是判断当前的登陆用户是否对数上的栏目有权限, 因为系统要求有权限和没权限显示不同的URL.

InitTreeView 函数是整段代码的入口,外部对类的调用,就从这个函数开始.参数我不多说了,自己看得出!

InitTree函数是个递归函数查找当前的类有无下级类别,如果头脑不是很清楚的时候,最好不要看这个函数! :)
     会走火入魔地!

代码执行后的效果:



#region 初始化显示栏目结构的TreeView控件

/// <summary>
/// 检查指定的用户对于该栏目是否有权限,[递归调用]
/// </summary>
/// <param name="pUserID">用户ID</param>
/// <param name="pCatalogID">栏目ID</param>
/// <returns>有权限返回True,没权限返回False</returns>
public bool CheckPermitFromTable(string pUserID,string pCatalogID)
{
try
{

DataRow [] rows = dsTree.Tables["Power"].Select ("Catalog_ID=" + pCatalogID);

if(rows!=null)
{
if(rows.Length>0)
{
return true;
}
else
{
/*
*如果当前栏目没有权限,查询系统中上级栏目是否有权限,
如果有返回True,如果一直查到最高级别栏目还没有操作权限,
则确认用户对于当前栏目没有操作权限. ---王海波
*/
rows=dsTree.Tables["Catalog"].Select ("ID=" + pCatalogID);

if(rows.Length>0 && rows[0]["Parent_ID"].ToString().Trim()!="" )
{
if(CheckPermitFromTable(pUserID,rows[0]["Parent_ID"].ToString())) //[递归调用]
return true;
}

return false;
}
}
else
{
return false;
}
}
catch(SqlException se)
{
ErrorMessage=se.Message;
return false;
}
}


/// <summary>
/// 根据参数获取工作栏的栏目信息
/// </summary>
/// <param name="pParentID">获取当前栏目ID下的所有子栏目,如果pParentID=0,则获取一级栏目信息</param>
/// <param name="pUserID">用户ID</param>
/// <returns>返回DataSet结果集</returns>
public DataSet GetCatalogInfo(int pParentID,string pUserID)
{
try
{
string strSQL,strSQL1;

if(pParentID==0)
{
strSQL="Select * From T_hg_catalog Where State=0 And Parent_ID is NULL Order by ID Asc";
}
else
{
strSQL="Select * From T_hg_catalog Where State=0 Order by ID Asc";
}

strSQL1="Select * From T_hg_Power Where User_ID='"+pUserID+"'";

DataSet ds=new DataSet();

//获取栏目数据
SqlDataAdapter sqlAdpt=new SqlDataAdapter(strSQL,Cn);

sqlAdpt.Fill(ds,"Catalog");


//获取用户栏目权限权限数据
sqlAdpt=new SqlDataAdapter(strSQL1,Cn);
sqlAdpt.Fill(ds,"Power");

return ds;

}
catch(SqlException se)
{
ErrorMessage=se.Message;
return null;
}
}

/// <summary>
/// 初始化TreeView
/// </summary>
/// <param name="tv">TreeView控件</param>
/// <param name="RootImageURL">TreeView控件根节点的图片</param>
/// <param name="pUserID">当前操作用户ID</param>
public void InitTreeView(TreeView tv,string RootImageURL,string pUserID)
{
//初始化第一级Tree Node Start
DataSet ds=GetCatalogInfo(0,pUserID);

tv.Nodes.Clear();
tv.ImageUrl= RootImageURL;

for(int i=0;i<ds.Tables[0].Rows.Count;i++)
{
TreeNode tn1=new TreeNode();

tn1.ImageUrl="/Images/ico01.gif";
tn1.ID="L1-"+i.ToString();
tn1.Text=ds.Tables[0].Rows[i]["ID"].ToString()+"-"+ds.Tables[0].Rows[i]["Catalog_Name"].ToString();

dsTree=GetCatalogInfo(int.Parse(ds.Tables[0].Rows[i]["ID"].ToString()),pUserID);

if(CheckPermitFromTable(pUserID,ds.Tables[0].Rows[i]["ID"].ToString()))
tn1.NavigateUrl="/Admin/HG_Info_Manage.aspx?CID="+ds.Tables[0].Rows[i]["ID"].ToString()+"&CatalogName="+ds.Tables[0].Rows[i]["Catalog_Name"].ToString();
else
tn1.NavigateUrl="/Info/T_Info_Index.aspx?CID="+ds.Tables[0].Rows[i]["ID"].ToString()+"&CatalogName="+ds.Tables[0].Rows[i]["Catalog_Name"].ToString();

tn1.Expanded=true;

tv.Nodes.Add(tn1);

InitTree(tv.Nodes[i].Nodes,ds.Tables[0].Rows[i]["ID"].ToString(),pUserID);

pLevel=0; //树的层还原

}
//初始化第一级Tree Node End

//初始化填充TreeView的DataSet

}

/// <summary>
/// 递归调用该函数进行树的显示
/// </summary>
/// <param name="Nds">树的节点</param>
/// <param name="parentId">上级栏目的ID</param>
/// <param name="pUserID">当前操作用户ID</param>
private void InitTree(TreeNodeCollection Nds,string parentId,string pUserID)
{
DataView dv=new DataView();

TreeNode tmpNd;

string intId;

dv.Table=dsTree.Tables[0];

DataRow [] rows = dv.Table.Select ("Parent_Id=" + parentId);

pLevel++; //树的层加1

int pCurLevel=pLevel;

for(int i=0;i<rows.Length;i++)
{
DataRow drv=rows[i];

tmpNd=new TreeNode();

tmpNd.ID=drv["ID"].ToString();
tmpNd.Text=drv["ID"].ToString()+"-"+drv["Catalog_Name"].ToString();

//改变数层图标
switch(pLevel)
{
case 1:
tmpNd.ImageUrl="/images/fling.gif";
break;

case 2:
tmpNd.ImageUrl="/images/ico03.gif";
break;

case 3:
tmpNd.ImageUrl="/images/state_normal.gif";
break;

}

if(CheckPermitFromTable(pUserID,drv["ID"].ToString()))
tmpNd.NavigateUrl="/Admin/HG_Info_Manage.aspx?CID="+drv["ID"].ToString()+"&CatalogName="+drv["Catalog_Name"].ToString();
else
tmpNd.NavigateUrl="/Info/HG_Info_Index.aspx?CID="+drv["ID"].ToString()+"&CatalogName="+drv["Catalog_Name"].ToString();

Nds.Add(tmpNd);

intId=drv["Parent_Id"].ToString();

InitTree(tmpNd.Nodes,tmpNd.ID,pUserID);

pLevel=pCurLevel;

}

}


#endregion


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值