|zyciis| Repeater如何绑定无限级的菜单,前提是一层层绑定,不是先生成数据后再绑定,谢谢

zyciis292 2010-02-25 03:10:28
如有表
table
ID Name ParentID
1 小张 null
2 小王 1
3 小李 1
4 小红 2
5 小青 2
6 小白 5
--------------------
要绑定生成
<ul>
<li>
小张(1)
<ul>
<li>
小王(2)
<ul>
<li>
小红(4)
</li>
<li>
小青(5)
<ul>
<li>
小白(6)
</li>
</li>
</ul>
</li>
<li>
小李(3)
</li>
</ul>
</li>
</ul>
--------------------
谢谢
...全文
454 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿非 2010-02-26
  • 打赏
  • 举报
回复

DataView dv;

private DataView GetDataSource()
{
DataTable dt = new DataTable();

dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
dt.Columns.Add(new DataColumn("Name", typeof(String)));
dt.Columns.Add(new DataColumn("ParentID", typeof(Int32)));

DataRow dr = dt.NewRow();
dr[0] = 1;
dr[1] = "小张";
dr[2] = -1;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 2;
dr[1] = "小王";
dr[2] = 1;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 3;
dr[1] = "小李";
dr[2] = 1;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 4;
dr[1] = "小红";
dr[2] = 2;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 5;
dr[1] = "小青";
dr[2] = 2;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 6;
dr[1] = "小白";
dr[2] = 5;
dt.Rows.Add(dr);

return dt.DefaultView;
}

private DataView GetDataSourceEX()
{
DataTable dt = new DataTable();

dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
dt.Columns.Add(new DataColumn("Name", typeof(String)));
dt.Columns.Add(new DataColumn("ParentID", typeof(Int32)));

DataRow dr = dt.NewRow();
dr[0] = 1;
dr[1] = "小张";
dr[2] = -1;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 2;
dr[1] = "小王";
dr[2] = -1;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 3;
dr[1] = "小齐";
dr[2] = 1;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 4;
dr[1] = "小薛";
dr[2] = 1;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 5;
dr[1] = "小红";
dr[2] = 2;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 6;
dr[1] = "小青";
dr[2] = 3;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 7;
dr[1] = "小白";
dr[2] = 5;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 8;
dr[1] = "小黄";
dr[2] = 5;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 9;
dr[1] = "小绿";
dr[2] = 8;
dt.Rows.Add(dr);

dr = dt.NewRow();
dr[0] = 10;
dr[1] = "小蓝";
dr[2] = 4;
dt.Rows.Add(dr);

return dt.DefaultView;
}

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
dv = GetDataSource();

//dv = GetDataSourceEX();

dv.RowFilter = "ParentID=-1";

rp.DataSource = dv;
rp.DataBind();
}
}

private string Recursion(object ID)
{
dv.RowFilter = string.Format("ParentID={0}", ID);

DataTable dt = dv.ToTable();

if (dt.Rows.Count == 0)
{
return "";
}

StringBuilder sb = new StringBuilder();

for (int i = 0; i < dt.Rows.Count; i++)
{
if (i == 0)
{
sb.Append("<ul>");
}

sb.AppendFormat("<li>{0}({1}){2}</li>", dt.Rows[i][1].ToString(), dt.Rows[i][0].ToString(), Recursion(dt.Rows[i][0]));

if (i == dt.Rows.Count - 1)
{
sb.Append("</ul>");
}
}

return sb.ToString();
}

protected string GetHTMLByID(object objID)
{
if (objID == null)
{
return "";
}

dv = GetDataSource();

return Recursion(objID);
}
阿非 2010-02-26
  • 打赏
  • 举报
回复

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">

<asp:Repeater ID="rp" runat="server">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li>
<%#string.Format("{0}({1})",Eval("Name"),Eval("ID"))%>
<asp:Literal ID="lit" runat="server" Text='<%#GetHTMLByID(Eval("ID")) %>'></asp:Literal>
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>

</form>
</body>
</html>
qqzeng-ip 2010-02-25
  • 打赏
  • 举报
回复
zhao8848jun 2010-02-25
  • 打赏
  • 举报
回复
首先表结构就不能按照树型排序取出数据,所以用Repeater顺序绑定是无法实现的,可以考虑加一字段:
table
ID Name ParentID TreeOrder
1 小张 null 0_1
2 小王 1 0_1_2
3 小李 1 0_1_3
4 小红 2 0_1_2_4
5 小青 2 0_1_2_5
6 小白 5 0_1_2_5_6
这样按照TreeOrder检出的数据就是按照树关系依次排出的
在Reaper绑定中声明一个临时变量i,初始值为1
然后判断TreeOrder中的_个数,如果大于i就加一层<ul>,如果相等就直接输出<li>,如果小于i就加一个封闭的</ul>
andrewsway 2010-02-25
  • 打赏
  • 举报
回复
引用 8 楼 andrewsway 的回复:
如果一层一层打开的话,建议用jQuery或者直接用JavaScript得了,比较灵活,自己控制的余地也比较大


和ajax一起用的啊
andrewsway 2010-02-25
  • 打赏
  • 举报
回复
如果一层一层打开的话,建议用jQuery或者直接用JavaScript得了,比较灵活,自己控制的余地也比较大
wosizy 2010-02-25
  • 打赏
  • 举报
回复
wosizy 2010-02-25
  • 打赏
  • 举报
回复
参考 这上面的代码试试```
http://www.jb51.net/article/4376.htm
暮光之灵 2010-02-25
  • 打赏
  • 举报
回复
对不起啊 没看清楚你的是无极循环
还是用response。write吧
没治了
暮光之灵 2010-02-25
  • 打赏
  • 举报
回复
弄个类 类中要有个items集合来用来存储子对象
然后用repeater绑定数据源 就OK了
zyciis292 2010-02-25
  • 打赏
  • 举报
回复
早些时候写的
你无限级分类,要展开 就不要 用控件了
学会用 Response.Write("html代码"); 这样效率高 灵活,就是代码多,考验你html和逻辑了
------------------------------
这样出来的我会,但是这样给人看html的话比较难理解
如果用Repeater绑定出来的话看起来会比较明了

前提是一层层绑定,不是先生成数据后再绑定
---------------------------
我也感觉有点奇怪,现在就不去理解这一句
如果用Repeater绑定出上面的样子

谢谢
新亿 2010-02-25
  • 打赏
  • 举报
回复
http://download.csdn.net/source/831975
早些时候写的
你无限级分类,要展开 就不要 用控件了
学会用 Response.Write("html代码"); 这样效率高 灵活,就是代码多,考验你html和逻辑了
阿非 2010-02-25
  • 打赏
  • 举报
回复
前提是一层层绑定,不是先生成数据后再绑定

这句该怎么解读

62,072

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧