闲极无聊写的递归, 分类

来源:互联网 发布:唐筛3个数据都大于1 编辑:程序博客网 时间:2024/06/05 16:22

表结构,在父类的ID中保存相对应的类别ID,以达到无限级数的栏目实现

类别ID 类别名称 父类的ID

求类别表达的写法


--数据库的建立角本及添加的数据
create table [TypeTable]
(
[AutoID] int identity(1,1) primary key,
[Name] varchar(40) not null,
[ParentID] int default(0)
)

--添加数据
insert into typetable values('大类一',0)
insert into typetable values('大类二',0)
insert into typetable values('大类三',0)
insert into typetable values('大类四',0)
insert into typetable values('大类五',0)

insert into typetable values(' 大类一 子类一',1)
insert into typetable values(' 大类一 子类二',1)
insert into typetable values(' 大类一 子类三',1)
insert into typetable values(' 大类一 子类四',1)

insert into typetable values(' 大类二 子类一',2)
insert into typetable values(' 大类二 子类二',2)
insert into typetable values(' 大类二 子类三',2)
insert into typetable values(' 大类二 子类四',2)

insert into typetable values('  一 大类 二子类 的子类一',7)
insert into typetable values('  一 大类 三子类 的子类一',8)

-----
数据结构应该是这个样子的

程序实现

首先添加对SqlClient命名空间的引用
using System.Data.SqlClient;

private void Page_Load(object sender, System.EventArgs e)
{
 DataSet ds = new DataSet();
 using(SqlDataAdapter sqla= new SqlDataAdapter("select * from typetable",new SqlConnection("server=.;uid=sa;pwd=123456;database=xmlhttp")))//读取数据库中的数据
 {
  sqla.Fill(ds,"TypeTalbe");
 }
 DataTable dt = ds.Tables[0];
 ArrayList arryList = new ArrayList(); //新建数组保存读取的栏目名称
 this.GetChildren(0,ref dt,ref arryList); //递归读取栏目,这里的0就相当于根结点
 foreach(object o in arryList)
 {
  Response.Write("<br>"+o.ToString());
 }
   
}

//为了传值的方便,这里我用了引用参数
private void GetChildren(int parentID,ref DataTable Dt,ref ArrayList arrayList)
{
 DataRow[] drv = Dt.Select("ParentID = "+parentID);  //查找相对应的父结点ID
 if(drv.Length > 0)     //这样就表明还有子类了,我们要接着递归
 {
  foreach(DataRow dr in drv)
  {
   arrayList.Add(dr["Name"]); //添加栏目名称
   this.GetChildren(int.Parse(dr["AutoID"].ToString()),ref Dt,ref arrayList); //递归
  }
 }
}

上面的示例运行的时候,页面结果是

大类一
大类一 子类一
大类一 子类二
一 大类 二子类 的子类一
大类一 子类三
一 大类 三子类 的子类一
大类一 子类四
大类二
大类二 子类一
大类二 子类二
大类二 子类三
大类二 子类四
大类三
大类四
大类五

基本达到要求.

原创粉丝点击