• IList接口数据动态、递归生成TreeView


    TreeView导航控件用站点地图(web.sitemap)Xml(xmlFile.xml)来绑定,很简单,也很实用。但,如果要实现增加,删除,修改,查询等操作,还需要动态生成,这在后台管理系统中经常会用到。

    本文讲解的是一个三层架构中从SQL Server数据库中获得的Ilist接口数据,动态生成TreeView的一个实例。为演示方便,这个数据我们用程序生成,想关的辅助代码尽可能地进行了简化。

    一、准备工作

    1、  App_Code中添加类FileInfo.cs,代码如下:

    1. publicclass FileInfo 
    2.     privateint id; 
    3.     privatestring name; 
    4.     privateint parentid; 
    5.  
    6.     publicint Id 
    7.     { 
    8.         set { id = value; } 
    9.         get { return id; } 
    10.     } 
    11.  
    12.     publicstring Name 
    13.     { 
    14.         set { name = value; } 
    15.         get { return name; } 
    16.     } 
    17.  
    18.     publicint ParentId 
    19.     { 
    20.         set { parentid = value; } 
    21.         get { return parentid; } 
    22.     } 
    1、  右击网站Web→添加→Web窗体→Step1.aspxStep1.aspx.cs中代码如下:
    1. using System; 
    2. using System.Collections.Generic; 
    3.  
    4. public partial class Step1 : System.Web.UI.Page  
    5.     IList<FileInfo> files=new List<FileInfo>(); 
    6.  
    7.     protectedvoid Page_Load(object sender, EventArgs e) 
    8.     { 
    9.         PrepareData(); 
    10.  
    11.         repIList.DataSource = files; 
    12.         repIList.DataBind(); 
    13.     } 
    14.  
    15.     //准备填充TreeView控件的IList接口数据 
    16.     void PrepareData() 
    17.     { 
    18.         for (int i = 0; i < 10; i++) 
    19.         { 
    20.             FileInfo fileinfo = new FileInfo(); 
    21.             files.Add(fileinfo); 
    22.         } 
    23.  
    24.         files[0].Id = 4;        files[0].Name = "a1";       files[0].ParentId = 0; 
    25.         files[1].Id = 5;        files[1].Name = "a2";       files[1].ParentId = 0; 
    26.         files[2].Id = 6;        files[2].Name = "a3";       files[2].ParentId = 0; 
    27.         files[3].Id = 7;        files[3].Name = "a11";      files[3].ParentId = 4; 
    28.         files[4].Id = 8;        files[4].Name = "a12";      files[4].ParentId = 4; 
    29.         files[5].Id = 9;        files[5].Name = "a21";      files[5].ParentId = 5; 
    30.         files[6].Id = 10;       files[6].Name = "a31";      files[6].ParentId = 6; 
    31.         files[7].Id = 11;       files[7].Name = "a32";      files[7].ParentId = 6; 
    32.         files[8].Id = 12;       files[8].Name = "a321";     files[8].ParentId = 11; 
    33.         files[9].Id = 13;       files[9].Name = "a322";     files[9].ParentId = 11; 
    34.     } 
    1、  Step1.aspx中添加Repeater控件,显示Ilist接口的数据files,为节省篇幅,代码略,数据显示效果如图示:

    二、显示一级数据项,也就是ParentId0的数据

    1、  新建Step2.aspx

    2、  Step2.aspx中添加TreeView控件,代码如下:

    1. <div> 
    2.     <asp:TreeViewID="tvFile"runat="server"></asp:TreeView> 
    3. </div> 
    3、  Step2.aspx.cs中,完整代码如下:
    1. using System; 
    2. using System.Collections.Generic; 
    3. using System.Web.UI.WebControls; 
    4.  
    5. public partial class Step2 : System.Web.UI.Page  
    6.     IList<FileInfo> files=new List<FileInfo>(); 
    7.  
    8.     protectedvoid Page_Load(object sender, EventArgs e) 
    9.     { 
    10.         PrepareData(); 
    11.  
    12.         FillTreeView(null, 0); 
    13.     } 
    14.  
    15.     void FillTreeView(TreeNode node, int parentid) 
    16.     { 
    17.         IList<FileInfo> listTemp = ListFilter(parentid); 
    18.  
    19.         foreach (FileInfo model in listTemp) 
    20.         { 
    21.             TreeNode nodeTemp = new TreeNode(); 
    22.  
    23.             nodeTemp.Text = model.Name; 
    24.             nodeTemp.Value = model.Id.ToString(); 
    25.  
    26.             tvFile.Nodes.Add(nodeTemp); 
    27.         } 
    28.     } 
    29.  
    30.     //获取指定ParentId的数据 
    31.     List<FileInfo> ListFilter(int parentid) 
    32.     { 
    33.         List<FileInfo> listTemp = new List<FileInfo>(); 
    34.         foreach (FileInfo model in files) 
    35.             if (model.ParentId == parentid) 
    36.                 listTemp.Add(model); 
    37.         return listTemp; 
    38.     } 
    39.  
    40.     //准备填充TreeView控件的IList接口数据 
    41.     void PrepareData() 
    42.     { 
    43.         for (int i = 0; i < 10; i++) 
    44.         { 
    45.             FileInfo fileinfo = new FileInfo(); 
    46.             files.Add(fileinfo); 
    47.         } 
    48.  
    49.         files[0].Id = 4;        files[0].Name = "a1";       files[0].ParentId = 0; 
    50.         files[1].Id = 5;        files[1].Name = "a2";       files[1].ParentId = 0; 
    51.         files[2].Id = 6;        files[2].Name = "a3";       files[2].ParentId = 0; 
    52.         files[3].Id = 7;        files[3].Name = "a11";      files[3].ParentId = 4; 
    53.         files[4].Id = 8;        files[4].Name = "a12";      files[4].ParentId = 4; 
    54.         files[5].Id = 9;        files[5].Name = "a21";      files[5].ParentId = 5; 
    55.         files[6].Id = 10;       files[6].Name = "a31";      files[6].ParentId = 6; 
    56.         files[7].Id = 11;       files[7].Name = "a32";      files[7].ParentId = 6; 
    57.         files[8].Id = 12;       files[8].Name = "a321";     files[8].ParentId = 11; 
    58.         files[9].Id = 13;       files[9].Name = "a322";     files[9].ParentId = 11; 
    59.     } 
    4.        右击Step2.aspx,在浏览器中查看运行结果,如图所示:

    二、显示二级数据项

    显示二级数据项,也就是在显示一级数据项的时候,循环中,每添加一项,都把父节点ParentId为该数据项的Id的数据项也添加到该数据项的子节点中。

    1、  复制粘贴Step2.aspx,重命名为Step3.aspx,修改Step3.aspx.cs中的代码,完整代码如下:

    1. using System; 
    2. using System.Collections.Generic; 
    3. using System.Web.UI.WebControls; 
    4.  
    5. public partial class Step3 : System.Web.UI.Page  
    6.     IList<FileInfo> files=new List<FileInfo>(); 
    7.  
    8.     protectedvoid Page_Load(object sender, EventArgs e) 
    9.     { 
    10.         PrepareData(); 
    11.  
    12.         FillTreeView(null, 0); 
    13.     } 
    14.  
    15.     void FillTreeView(TreeNode node, int parentid) 
    16.     { 
    17.         IList<FileInfo> listTemp = ListFilter(parentid); 
    18.  
    19.         foreach (FileInfo model in listTemp) 
    20.         { 
    21.             TreeNode nodeTemp = new TreeNode(); 
    22.  
    23.             nodeTemp.Text = model.Name; 
    24.             nodeTemp.Value = model.Id.ToString(); 
    25.  
    26.             tvFile.Nodes.Add(nodeTemp); 
    27.  
    28.             FillTreeView1(nodeTemp, model.Id); 
    29.         } 
    30.     } 
    31.  
    32.     void FillTreeView1(TreeNode node, int parentid) 
    33.     { 
    34.         IList<FileInfo> listTemp = ListFilter(parentid); 
    35.  
    36.         foreach (FileInfo model in listTemp) 
    37.         { 
    38.             TreeNode nodeTemp = new TreeNode(); 
    39.  
    40.             nodeTemp.Text = model.Name; 
    41.             nodeTemp.Value = model.Id.ToString(); 
    42.  
    43.             node.ChildNodes.Add(nodeTemp); 
    44.         } 
    45.     } 
    46.  
    47.     //获取指定ParentId的数据 
    48.     List<FileInfo> ListFilter(int parentid) 
    49.     { 
    50.         List<FileInfo> listTemp = new List<FileInfo>(); 
    51.         foreach (FileInfo model in files) 
    52.             if (model.ParentId == parentid) 
    53.                 listTemp.Add(model); 
    54.         return listTemp; 
    55.     } 
    56.  
    57.     //准备填充TreeView控件的IList接口数据 
    58.     void PrepareData() 
    59.     { 
    60.         for (int i = 0; i < 10; i++) 
    61.         { 
    62.             FileInfo fileinfo = new FileInfo(); 
    63.             files.Add(fileinfo); 
    64.         } 
    65.  
    66.         files[0].Id = 4;        files[0].Name = "a1";       files[0].ParentId = 0; 
    67.         files[1].Id = 5;        files[1].Name = "a2";       files[1].ParentId = 0; 
    68.         files[2].Id = 6;        files[2].Name = "a3";       files[2].ParentId = 0; 
    69.         files[3].Id = 7;        files[3].Name = "a11";      files[3].ParentId = 4; 
    70.         files[4].Id = 8;        files[4].Name = "a12";      files[4].ParentId = 4; 
    71.         files[5].Id = 9;        files[5].Name = "a21";      files[5].ParentId = 5; 
    72.         files[6].Id = 10;       files[6].Name = "a31";      files[6].ParentId = 6; 
    73.         files[7].Id = 11;       files[7].Name = "a32";      files[7].ParentId = 6; 
    74.         files[8].Id = 12;       files[8].Name = "a321";     files[8].ParentId = 11; 
    75.         files[9].Id = 13;       files[9].Name = "a322";     files[9].ParentId = 11; 
    76.     } 
    2、  右击Step3.aspx在浏览器中查看运行结果,如图所示:

    四、递归填充三级,乃至多级数据项

    仔细观查填充一级数据项的函数void FillTreeView(TreeNodenode,int parentid)和填充二级数据项的函数void FillTreeView1(TreeNodenode,int parentid),除了填充的位置代码不同,其它都一样,这时,我们完全不需要单独调用函数FillTreeView1(),而直接进行递归调用,在填充的是一级根数据项,还是二级子数据项上加个判断即可。

    1、复制粘贴Step3.aspx,重命名为Step4.aspx,修改Step4.aspx.cs中的代码,完整代码如下:

    1. using System; 
    2. using System.Collections.Generic; 
    3. using System.Web.UI.WebControls; 
    4.  
    5. public partial class Step4 : System.Web.UI.Page  
    6.     IList<FileInfo> files=new List<FileInfo>(); 
    7.  
    8.     protectedvoid Page_Load(object sender, EventArgs e) 
    9.     { 
    10.         PrepareData(); 
    11.  
    12.         FillTreeView(null, 0); 
    13.     } 
    14.  
    15.     void FillTreeView(TreeNode node, int parentid) 
    16.     { 
    17.         IList<FileInfo> listTemp = ListFilter(parentid); 
    18.  
    19.         foreach (FileInfo model in listTemp) 
    20.         { 
    21.             TreeNode nodeTemp = new TreeNode(); 
    22.  
    23.             nodeTemp.Text = model.Name; 
    24.             nodeTemp.Value = model.Id.ToString(); 
    25.  
    26.             if(parentid==0) 
    27.                 tvFile.Nodes.Add(nodeTemp); 
    28.             else 
    29.                 node.ChildNodes.Add(nodeTemp); 
    30.  
    31.             FillTreeView(nodeTemp, model.Id); 
    32.         } 
    33.     } 
    34.  
    35.      
    36.     //获取指定ParentId的数据 
    37.     List<FileInfo> ListFilter(int parentid) 
    38.     { 
    39.         List<FileInfo> listTemp = new List<FileInfo>(); 
    40.         foreach (FileInfo model in files) 
    41.             if (model.ParentId == parentid) 
    42.                 listTemp.Add(model); 
    43.         return listTemp; 
    44.     } 
    45.  
    46.     //准备填充TreeView控件的IList接口数据 
    47.     void PrepareData() 
    48.     { 
    49.         for (int i = 0; i < 10; i++) 
    50.         { 
    51.             FileInfo fileinfo = new FileInfo(); 
    52.             files.Add(fileinfo); 
    53.         } 
    54.  
    55.         files[0].Id = 4;        files[0].Name = "a1";       files[0].ParentId = 0; 
    56.         files[1].Id = 5;        files[1].Name = "a2";       files[1].ParentId = 0; 
    57.         files[2].Id = 6;        files[2].Name = "a3";       files[2].ParentId = 0; 
    58.         files[3].Id = 7;        files[3].Name = "a11";      files[3].ParentId = 4; 
    59.         files[4].Id = 8;        files[4].Name = "a12";      files[4].ParentId = 4; 
    60.         files[5].Id = 9;        files[5].Name = "a21";      files[5].ParentId = 5; 
    61.         files[6].Id = 10;       files[6].Name = "a31";      files[6].ParentId = 6; 
    62.         files[7].Id = 11;       files[7].Name = "a32";      files[7].ParentId = 6; 
    63.         files[8].Id = 12;       files[8].Name = "a321";     files[8].ParentId = 11; 
    64.         files[9].Id = 13;       files[9].Name = "a322";     files[9].ParentId = 11; 
    65.     } 
     

    2、  右击Step3.aspx,在浏览器中查看运行结果,如图示:

    2、  这时我们发现,不仅二级数据项已经填充上去了,连三级、乃至更多级的数据项也会填充上去。

    3、  仔细想想,道理很简单,因为,填充二级乃至多级的数据项操作,和填充二级原理是一样的,都是在填充上一级的同时,查找父级ParentId为该级的Id的数据项,填充到该级的节点中。

    一、结束语

    递归调用,很多时候很绕人,过程不容易理解得很清晰,但象本例一样,先不考虑什么递归算法,先按照简单的思路做,在做的过程中发现的递归的妙用,不仅过这个过程能有个非常清晰的理解,也更体会到了递归的好处。

    版权所有©2012,西园工作室.欢迎转载,转载请注明出处.源代码:QQ群共享13033480(IList接口数据动态、递归生成TreeView【源代码】)

  • 相关阅读:
    关于js中event的target和currentTarget的区别
    linux下安装tomcat
    Linux下安装配置JDK
    上传bash: rz: command not found
    Linux忘记 root密码的解决办法
    Linux的关机与重启命令
    windows版本jenkins部署django项目
    Jenkins部署邮件通知
    Jenkins+Ant+Jmeter接口自动化集成测试实例
    postman+jenkins集成
  • 原文地址:https://www.cnblogs.com/WestGarden/p/2798930.html
Copyright © 2020-2023  润新知