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

思路:首先把整个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
结果:
ClassIDClassNameClassPID
1Class10
2Class20
3Class30
4Class40
5Class51
6Class61
7Class72
8Class82
9Class93
10Class103

二、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);
最终结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现无限分类的方法有多种,其中包括递归和非递归两种方式。下面分别介绍一下这两种方法的实现。 1. 递归实现无限分类 递归实现无限分类的方法是将分类数据作为一个树形结构来处理。具体实现步骤如下: (1)从数据库中获取所有分类数据,并按照父子关系组织为树形结构。 (2)遍历树形结构,输出每个分类的名称以及子分类的名称。 (3)对于每个子分类,重复步骤(2)。 下面是一个递归实现无限分类的示例代码: ```php function getCategoryTree($parent_id = 0, $level = 0) { $categories = getCategoryByParentId($parent_id); if (count($categories) > 0) { foreach ($categories as $category) { echo str_repeat('-', $level) . $category['name'] . '<br>'; getCategoryTree($category['id'], $level + 1); } } } function getCategoryByParentId($parent_id) { // 从数据库中获取 $parent_id 的所有子分类数据 // ... return $categories; } // 输出所有分类 getCategoryTree(); ``` 2. 非递归实现无限分类递归实现无限分类的方法是使用堆栈(或队列)来处理分类数据。具体实现步骤如下: (1)从数据库中获取所有分类数据,并按照父子关系组织为一个数组。 (2)将根分类(即 parent_id 为 0 的分类)入栈。 (3)从堆栈中取出一个分类,并输出该分类的名称。 (4)将该分类的所有子分类依次入栈。 (5)重复步骤(3)和(4),直到堆栈为空。 下面是一个非递归实现无限分类的示例代码: ```php function getCategoryTree() { $categories = getCategoryByParentId(0); $stack = array(); foreach ($categories as $category) { array_push($stack, array('category' => $category, 'level' => 0)); } while (count($stack) > 0) { $current = array_pop($stack); echo str_repeat('-', $current['level']) . $current['category']['name'] . '<br>'; $children = getCategoryByParentId($current['category']['id']); foreach ($children as $child) { array_push($stack, array('category' => $child, 'level' => $current['level'] + 1)); } } } function getCategoryByParentId($parent_id) { // 从数据库中获取 $parent_id 的所有子分类数据 // ... return $categories; } // 输出所有分类 getCategoryTree(); ``` 以上就是php实现无限分类的两种方法。从实现难度和效率上来看,递归方法更简单,但对于数据量较大的情况,可能会导致栈溢出。非递归方法虽然复杂一些,但可以处理更大的数据量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值