如下图的效果:
方法一:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable dt = GetCategory().Tables[0];
//绑定数据到栏目列表上
BindToChannelList(dt, 0);
}
}
/// <summary>
/// 递归绑定数据到ddlChannelList控件上,形成树状结构
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="categoryid">栏目id</param>
private void BindToChannelList(DataTable dt, int categoryid)
{
//DataView dv = dt.DefaultView;使用这句在asp.net 1.1中会出现"在位置 1 处没有任何行。"的错误,感谢阿耀同学的帮助.
DataView dv=new DataView(dt);
dv.RowFilter = " ParentID= " + categoryid.ToString(); //过滤
int layer = 0; //默认为第一层
foreach (DataRowView drv in dv)
{
layer = int.Parse(drv["Layer"].ToString().Trim()); //取得第几层
string span = "";
if (categoryid != 0)
{
for (int i = 0; i < layer; i++)
{
span += " ";
}
span += "|╴";//添加前面的空格
}
ListItem li = new ListItem();
li.Text = span + drv["CategoryName"].ToString();
li.Value = drv["CategoryID"].ToString();
this.ddlChannelList.Items.Add(li);
BindToChannelList(dt, Convert.ToInt32(drv["CategoryID"]));
}
}
----数据库表结构
CREATE TABLE [Category] (
[CategoryID] [int] IDENTITY (1, 1) NOT NULL ,
[CategoryName] [nvarchar] (255) NOT NULL ,
[Layer] [int] NULL DEFAULT (1),
[ParentID] [int] NULL DEFAULT (0),
[Intro] [nvarchar] (255) NULL ,
[AddTime] [datetime] NULL DEFAULT (getdate()),
CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED
(
[CategoryID]
) ON [PRIMARY]
) ON [PRIMARY]
GO
方法二:
思路应该很简单,就是先绑定根节点,再循环绑定子节点!父节点和子节点之间为了显示出层次结构,用空格格开,不过不是space键,没用的,必须用v1的特殊字符1。
/// <summary>
/// 绑定根节点
/// </summary>
void bindGroup()
{
DataTable dt =//获取所有节点
if(dt.Rows.Count>0)
{
foreach(DataRow row in dt.Rows)
{
if(row["ParentId"].ToString().Trim()=="0")//绑定根节点
{
this.drpItGroup.Items.Add(new ListItem(row["Name"].ToString(),row["Id"].ToString()));
this.bindDropChildItem(this.drpItGroup,dt,row["Id"].ToString(),1);
}
}
}
}
/// <summary>
/// 绑定子节点
/// </summary>
/// <param name="d"></param>
/// <param name="dt"></param>
/// <param name="id"></param>
/// <param name="length"></param>
void bindDropChildItem(DropDownList d,DataTable dt,string id,int length)
{
DataRow[] rows=dt.Select("ParentId='"+id+"'","Id DESC");//取出id子节点进行绑定
for(int i=0;i<rows.Length;i++)
{
this.drpItGroup.Items.Add(new ListItem(this.SpaceLength(length)+rows[i]["Name"].ToString(),rows[i]["Id"].ToString()));
this.bindDropChildItem(d,dt,rows[i]["Id"].ToString(),length+1);//空白数目加1
}
}
/// <summary>
/// 子节点前面的空白数
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
string SpaceLength(int i)
{
string space="";
for(int j=0;j<i;j++)
{
space+=" ";//注意这里的空白是智能abc输入法状态下的v11字符;
}
return space;
}
这样就大功告成了,绑定一下就可以看到效果了!还可以在客户端进行添加节点,方法相似!