如何构建无限树层次结构?

时间:2017-02-21 18:02:01

标签: asp.net vb.net treeview hierarchical-data

我从昨天起就开始研究这件事了,我完全难过了。我在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中。我不确定如何将数据从数据库中拉出来。

1 个答案:

答案 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有助于提高效率。