无限分层如何设计数据库

nbzzw 2012-10-16 07:54:07
求高手指导,网站栏目无限分层,应当怎样设计数据库?
怎样实现?有没有例子可以参考一下。
...全文
288 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
nbzzw6688 2012-10-17
  • 打赏
  • 举报
回复
预览效果图:


详见:http://www.soaspx.com/dotnet/csharp/csharp_20101109_6358.html


数据库结构:

id(int) classname(string) parentid(int) sort(int用于显示与排序)

1  家居  0  1

2  家电  0  2

3  沙发  1  1

4  某...  3 1

...

10 ...红色 4 1



注:

parentid 父节点ID

sort 用于隐藏或显示 兼排序功能



前台:




<asp:Repeater ID="rep" runat="server" onitemdatabound="rep_ItemDataBound">
<HeaderTemplate></HeaderTemplate>
<ItemTemplate></ItemTemplate>
<FooterTemplate></FooterTemplate>
</asp:Repeater>





后台:



代码

public partial class 递归2 : System.Web.UI.Page
{
public List<cmodel> list;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
rules r = new rules();
list = r.getlist();//读取数据库
this.rep.DataSource = list.Where(x => x.parentid == 0).ToList();//LINQ2OBJECT
this.rep.DataBind();
}
}

protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)
{
Literal l = new Literal();
l.ID = "ul";
l.Text="<ul>";
e.Item.Controls.Add(l);
}
else if (e.Item.ItemType == ListItemType.Footer)
{
Literal l = new Literal();
l.ID = "ul2";
l.Text = "</ul>";
e.Item.Controls.Add(l);
}
else if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
int id = (int)DataBinder.Eval(e.Item.DataItem, "id");
Literal li1 = new Literal();
li1.ID = "li1";
li1.Text = "<li>";
e.Item.Controls.Add(li1);

Literal name = new Literal();
name.ID = "n";
name.Text = DataBinder.Eval(e.Item.DataItem, "classname").ToString();
e.Item.Controls.Add(name);
List<cmodel> temp = list.Where(x => x.parentid == id).ToList();//LINQ2OBJECT
if (temp.Count > 0)
{
Repeater r = new Repeater();
TemplateBuilder tb = new TemplateBuilder();
tb.AppendLiteralString("");
r.HeaderTemplate = tb;
r.FooterTemplate = tb;
r.ItemTemplate = tb;
r.ItemDataBound += new RepeaterItemEventHandler(rep_ItemDataBound); //递归核心
r.DataSource = temp;
r.DataBind();
e.Item.Controls.Add(r);
}
Literal li2 = new Literal();
li2.ID = "li2";
li2.Text = "</li>";
e.Item.Controls.Add(li2);
}
}

}






使用到的类:

代码

public class rules
{
DataClasses1DataContext dc = new DataClasses1DataContext();

public List<cmodel> getlist()
{
var q = from x in dc.ClassFJ
where x.sort > 0 //用于控制显示隐藏
orderby x.sort //兼职排序功能
select new cmodel
(
x.id,
x.className,
x.parentid
);
return q.ToList<cmodel>();
}
}

public class cmodel
{
public cmodel(int i,string n,int p)
{
id = i;
classname = n;
parentid = p;
}
public int id { get; set; }
public string classname { get; set; }
public int parentid { get; set; }
}

抛砖引玉,话不多讲。
卷泥巴重来 2012-10-17
  • 打赏
  • 举报
回复
我用的主是1楼的方法!
紫魂一号 2012-10-17
  • 打赏
  • 举报
回复
两个字段就够了,所谓的字典表。id,上级id
缪军 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

[/Quote]
这个方案把相对路径法和绝对路径法相结合,强烈推荐,我再补充一下:
1.可以用表达式字段存储绝对路径,系统会在insert,update时自行维护绝对路径;
2.绝对路径改成(或者在增加一个字段)ParentPath更好
xuguv 2012-10-17
  • 打赏
  • 举报
回复
两个字段。ID,上级ID。

层次1--层次2---层次3--……

数据库就是这样的
层次1,ID=1980,上级ID=0 说明是顶层
层次2,ID=2542,上级ID=1980 说明他是 层次1的下层
层次3, ID=10045,上级ID=2542 说明他是 层次2的下层
白云任去留 2012-10-17
  • 打赏
  • 举报
回复
nbzzw 2012-10-17
  • 打赏
  • 举报
回复
有可以参考的例子吗?
iprometheus 2012-10-17
  • 打赏
  • 举报
回复
1楼.
hi_sxl_2010 2012-10-17
  • 打赏
  • 举报
回复
1楼的方式我们也在用.
fairyeye 2012-10-17
  • 打赏
  • 举报
回复
id,parentid 这类方法是可以解决。
但是考虑到效率问题,一旦数据量一多 以后递归量增多,会严重影响效率。
可以添加适当辅助字段,优化递归方式。
RUNBEAR 2012-10-16
  • 打赏
  • 举报
回复
像1L那样。 有个id,parentid足以
threenewbee 2012-10-16
  • 打赏
  • 举报
回复
id parentid name
----------------
1 null 根目录
2 1 一级a
3 2 二级a-1
4 2 二级a-2
5 1 一级b
6 5 二级b-1
7 6 三级b-1-1
8 5 二级b-2
...

62,046

社区成员

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

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

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

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