我从昨天起就开始研究这件事了,我完全难过了。我在VB.NET工作,但如果您愿意以这种方式回答,我可以理解C#。
基本上我有一个带有ID和父ID的SQL数据库中的项目,我需要将它们放在树中,如下所示:
<ul>
<li>Some item
<ul>
<li>Another item
<ul>
<li>This could go forever
<ul>
<li>Still going</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
目前我有一个嵌套的转发器可以工作,但它只能让我到第二级。它看起来像这样:
<asp:Repeater ID="parent" runat="server">
<ItemTemplate>
<ul>
<li><span><%#Container.DataItem("Name")%></span>
<asp:Repeater ID="child" DataSource='<%#CType(Container.DataItem, DataRowView).Row.GetChildRows("relation")%>' runat="server">
<ItemTemplate>
<ul>
<li><span><%#Container.DataItem("Name")%></span></li>
</ul>
</ItemTemplate>
</asp:Repeater>
</li>
</ul>
</ItemTemplate>
</asp:Repeater>
关系是这样的:
ds.Relations.Add("relation",
ds.Tables("Items").Columns("ID"),
ds.Tables("Items").Columns("ParentID"),
False)
我理解为什么它不会起作用,因为它没有模板来继续树。所以我试图找到解决方法。
我考虑编写一个函数来在后面的代码中构建字符串并将其粘贴到带有asp标记的html中。我不确定如何将数据从数据库中拉出来。
答案 0 :(得分:0)
我找到了一个临时解决方案,虽然效率极低。如果有人遇到我的问题,这至少会让你失望。对于大量数据,加载可能需要一整分钟。
如果有人可以评论如何提高效率,那就太好了。
代码背后:
Private Dim dt As New DataTable
Public Function BuildTree(ByVal ID As String) As String
Dim sb As New StringBuilder
dt = YourDatabase.GetChildren(ID) '<-- You'll have to write this function
sb.AppendLine("")
If dt.Rows.Count > 0 Then
sb.AppendLine("<ul>")
If dt.Rows.Count > 1 Then
For Each row As DataRow In dt.Rows
sb.AppendLine("<li>" & row("ItemName"))
' Recursive call
sb.AppendLine(BuildTree(row("ID").ToString))
sb.AppendLine("</li>")
Next
Else
sb.AppendLine("<li>" & dt.Rows(0)("ItemName").ToString & "</li>")
End If
sb.AppendLine("</ul>")
End If
Return sb.ToString
End Function
然后在您的aspx页面中执行以下操作:
<%#BuildTree(Container.DataItem("ID").ToString)%>
编辑:在函数外声明DataTable有助于提高效率。