蜗牛,在赛跑

--努力去改变吧
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2007-04-27 11:20  body  阅读(955)  评论(1编辑  收藏  举报

代码说明:

表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