DataTable中的数据:
TypeID , TypeName , ParentTypeID
1 类别A 0
2 类别B 0
3 子类别B1 2
4 子类别A1 1
5 孙类别A11 4
DropDownList的显示效果:
类别A
|--子类别A1
|----孙类别A11
类别B
|--子类别B1
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#region绑定
privatevoidfn_Bind_DropDownList()
{
DataSetds;
//数据库操作取出相应的ds
//ds=bll_Type.SelectAllTypeForChoose();
this.ddl_Type.Items.Clear();
if(ds!=null&&ds.Tables.Count>0&&ds.Tables[0].Rows.Count>0)
{
DataTabledtPara=ds.Tables[0];
DataTabledtTree=newDataTable();
dtTree=dtPara.Clone();
fn_ChangeToTree(refdtTree,dtPara,0,"0");//从顶级开始递归遍历
this.ddl_Type.DataSource=dtTree;
this.ddl_Type.DataTextField=dtTree.Columns[1].ToString();
this.ddl_Type.DataValueField=dtTree.Columns[0].ToString();
this.ddl_Type.DataBind();
}
this.ddl_Type.Items.Insert(0,newListItem("","0"));
}
#endregion
#region将类别DataTable信息整理成树状显示
privatevoidfn_ChangeToTree(refDataTabledtTree,DataTabledtPara,intintLevel,stringstrParentTypeID)
{
intLevel++;
stringstrLeftPre="";//处理每个级别的前缀内容显示
if(intLevel>1)
{
strLeftPre="|"+strLeftPre.PadLeft(intLevel*2,'-');
}
DataTabledt1=newDataTable();//当前类别
dt1=dtPara.Clone();
DataTabledt2=newDataTable();//下一级
dt2=dtPara.Clone();
for(inti=0;i<dtPara.Rows.Count;i++)
{
DataRowdr=dtPara.Rows[i];
stringstrRowParentTypeID=dr["ParentTypeID"].ToString();
if(strRowParentTypeID==strParentTypeID)
{
dt1.Rows.Add(dr.ItemArray);
}
else
{
dt2.Rows.Add(dr.ItemArray);
}
}
for(intj=0;j<dt1.Rows.Count;j++)
{
DataRowdr=dt1.Rows[j];
dr["TypeName"]=strLeftPre+dr["TypeName"].ToString();
dtTree.Rows.Add(dr.ItemArray);
stringstrRowParentTypeID=dr["TypeID"].ToString();
fn_ChangeToTree(refdtTree,dt2,intLevel,strRowParentTypeID);//递归
}
}
#endregion