“递归”之无限分类处理(一)

原创 2013年12月03日 23:41:29
思路:首先把整个DT拿到(避免多次访问数据库),然后首先加载根目录(classpid为0的),然后处理每个TreeNode,并使递归的方法去将当前TreeNode的子节点添加上去。

一、数据库准备

create table ClassList
(
   classid int identity(1,1) primary key,
   classname nvarchar(100) not null,
   classpid int
)

insert into ClassList(ClassName,ClassPID)
values
('Class1',0),
('Class2',0),
('Class3',0),
('Class4',0),
('Class5',1),
('Class6',1),
('Class7',2),
('Class8',2),
('Class9',3),
('Class1',3)

select * from ClassList
结果:
ClassID ClassName ClassPID
1 Class1 0
2 Class2 0
3 Class3 0
4 Class4 0
5 Class5 1
6 Class6 1
7 Class7 2
8 Class8 2
9 Class9 3
10 Class10 3

二、SQLHelper准备

class SQLHelper
{
   //连接字符串
   public static string constr="server=.;database=test;uid=sa;pwd=123456";

   //执行一条查询语句
   public static DataTable ExecuteQuery(string cmdText,params SqlParameter[] ps)
   {
      DataTable dt = new DataTable();
      using(SqlConnection conn=new SqlConnection(constr))
      {
         using (SqlCommand cmd = new SqlCommand(cmdText, conn))
         {
             using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
             {
                if (ps != null)
                {
                    cmd.Parameters.AddRange(ps);
                }
                sda.Fill(dt);
            }
         }
      }
      return dt;
   }
}


三、BLL准备

class BLL
{
    //拿到整个datatable
    public static DataTable GetClassDT()
    {
        string cmdText = "select * from classlist";
        DataTable dt = SQLHelper.ExecuteQuery(cmdText);
        return dt;
    }

    //整个datatable被保存到dt中
    static DataTable dt = GetClassDT();

    //绑定根
    public static void Bind(TreeView tv)
    {
       DataRow[] drs = dt.Select("classpid=0");
       foreach (DataRow dr in drs)
       {
           TreeNode tn = new TreeNode();
           tn.Text = dr["ClassName"].ToString();
           tn.Tag = Convert.ToInt32(dr["classid"]);
           tv.Nodes.Add(tn);
       }
       foreach (TreeNode pnode in tv.Nodes)
       {
           Bind(pnode);
       }
    }
    
    //绑定子
    public static void Bind(TreeNode pnode)
    {
        DataRow[] drs = dt.Select("classpid="+pnode.Tag);
        foreach(DataRow dr in drs)
        {
            TreeNode tn = new TreeNode();
            tn.Text = dr["classname"].ToString();
            tn.Tag = dr["classid"].ToString();
            pnode.Nodes.Add(tn);
            Bind(tn);
        }
     }
}


四、Form准备
BLL.Bind(treeView1);
最终结果:


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

PHP递归实现无限分类数组处理

PHP递归实现无限分类数组处理 1,php递归算法实现无限分类 递归算法对无限分类的数组进行处理,分两种情况, 一种树状展示(数组包含子数组), 一种非树状展示(子类按照顺序排在父...

递归处理List集合【无限级分类的实现】

=====一个实体类,也对应数据库的一张有层级关系用一个pid关联的表 public class Location { private int id; //id private Str...
  • lwphk
  • lwphk
  • 2014年09月29日 12:31
  • 3300

ASP递归无限级分类源码

  • 2009年10月09日 11:11
  • 643KB
  • 下载

sqlserver实现树形结构递归查询(无限极分类)

SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式百度百科公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它。每个CTE仅被...
  • jethai
  • jethai
  • 2016年08月28日 14:07
  • 3790

asp递归无限级分类(含数据库)

  • 2008年09月12日 14:19
  • 23KB
  • 下载

laravel5无限极分类递归

  • 2016年08月31日 15:20
  • 8KB
  • 下载

以迭代(非递归)方式获取无限分类中所有的最后一层子节点数据

$sql2 = "select cfg.parent_id,cfg.depth,cfg.name,cfg.val,cfg.id from cfg_dictionaries as cfg where c...

php 递归 实现无限分类 格式化数组

我们要做一个商品的无限分类 首先数据库字段为: id ----------商品主键id fid ---------- 商品父id name ---------- 商品名 最后输出的数...
  • uuus007
  • uuus007
  • 2012年05月27日 13:47
  • 3301

php不用递归实现无限分类数据的树形格式化

/**  * 此方法由@Tonton 提供  * http://my.oschina.net/u/918697  * @date 2012-12-12   */
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:“递归”之无限分类处理(一)
举报原因:
原因补充:

(最多只允许输入30个字)