数据库设计 BBS_BestArticleFolder 精华区目录表 Key: FolderID Field name 
Type 
Length 
Default 
Description FolderID 
int 
4 ID(自动编号) ParentFolderID 
int 


父目录ID FolderName 
Nvarchar 
80 
  
目录名 BoardID 
int 


版块ID CreaterUserID 
int 


创建者ID AddTime 
DateTime 

GetDate() 
创建时间 
二、树型目录构建过程 1、安装TreeView控件,我想大多数人都是会安装的,不会安装的去找相关文章一下下。 2、具体实现: a 数据生成 #region 树的数据生成事件  private DataView CreateDateView(int boardID) { BBSBestArticleFolderCollection bafc=new BBSBestArticleFolderCollection(); bafc.GetInfoByParentFolderID(boardID,-1); int bafcCount=bafc.Count; DataTable dt = new DataTable("table"); dt.Columns.Add("FolderID",System.Type.GetType("System.String")); dt.Columns.Add("FolderName",System.Type.GetType("System.String")); dt.Columns.Add("ParentFolderID",System.Type.GetType("System.String")); for(int i=0;i<bafcCount;i++) { DataRow dr=dt.NewRow(); dr[0]=bafc[i].ID; dr[1]=bafc[i].FolderName; dr[2]=bafc[i].ParentFolderID; dt.Rows.Add(dr); } dv=dt.DefaultView; return dv; } #endregion 一点说明:BBSBestArticleFolderCollection对象是个集合类,里面存储了所有符合条件的数据集合,GetInfoByParentFolderID是其中的一个方法,根据一定条件填充集合类的,此文主要讲TreeView构建树型目录,此处会在另外的文章中详述。 b #region TreeView节点生成方法 private void CreateTree(TreeNodeCollection folderTreeNodeCollection ,int parentID) { dv.RowFilter= "ParentFolderID="+parentID; int tmpParentFolderID=0; foreach(DataRowView drv in dv) { TreeNode tn=new TreeNode(); tn.ID=drv.Row["FolderID"].ToString(); tn.Text=drv.Row["FolderName"].ToString().Trim(); tmpParentFolderID=Int32.Parse(drv.Row["ParentFolderID"].ToString().Trim()); //tn.CheckBox=true; folderTreeNodeCollection.Add(tn); CreateTree(folderTreeNodeCollection[folderTreeNodeCollection.Count - 1].Nodes,Int32.Parse(tn.ID)); } 

一点解释:递归构建树的各级节点,其中的dv就是上一个方法生成的DataView 
c 取得数据的方法有了,生节节点的方法也有了,那么剩下的就是调用了 
CreateTree(TreeView1.Nodes,0); 
一点解释:TreeView1是控件ID,这个大家都知道吧,这里的0其实就是表示顶级目录,从顶级目录递归调用下去DI。 上面的代码是创建treeview的方法,小弟不懂的地方:
CreateTree()是怎么工作的啊?

解决方案 »

  1.   

    CreateTree 是按递归方式工作的...简化如下:
    CreateTree(Note n)
    {
    加载当前节点 n循环n所有子节点x
    {
    //即存在 x 子节点
    //调用自身,把x当参数传进去
    CreateTree(x);
         --*** 这里模拟展开自身代码 ***
         --加载当前节点 x
         --循环x所有子节点y
         --{
         -- 发现x里还有子节点y,调用自身,把y当参数传进去
         -- CreateTree(y);
                 -- 直到没有子节点退出当前 CreateTree 函数体
                 -- 回到 CreateTree(x) 继续循环加载
                 -- 可以看出递归需要相当的系统资源
         --}
    }
    }
      

  2.   

    http://time-is-life.cnblogs.com/articles/329691.html
      

  3.   

    yuanarea(超级赛亚人)
    谢谢了,我看明白了。
    刚发贴的时候没有人来看。但后来明白了。