2017-02-21 11 views
0

Я работаю над этим со вчерашнего дня, и я полностью в тупике. Я работаю в VB.NET, но я могу понять C#, если вы предпочитаете отвечать на него таким образом.Как построить бесконечную иерархию деревьев?

В принципе у меня есть элементы из базы данных 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) 

Я понимаю, почему это не будет работать, потому что он не имеет шаблон для продолжения дерева. Поэтому я пытаюсь найти способ обойти это.

Я рассмотрел возможность написания функции, чтобы просто построить строку в коде позади и вставить ее в html с помощью asp-тега. Я не был уверен, как это сделать, вытаскивая данные из базы данных.

ответ

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)%> 

EDIT: Декларирование DataTable вне функции помогает эффективность немного.

Смежные вопросы