2017-02-21 3 views
0

나는 어제부터이 일을 해왔고 완전히 난처 해했다. 나는 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

매우 비효율적이지만 일시적인 해결책을 찾았습니다. 누군가가 내 질문에 걸쳐 비틀 거림이 적어도 당신을 잡을 것입니다. 많은 양의 데이터를로드하는 데 최대 1 분이 소요될 수 있습니다.

누구든지이 방법을 더 효율적으로 만드는 것이 좋을 것이라고 의견을 말할 수 있다면. 뒤에

코드 : 귀하의 aspx 페이지에서 다음

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 

이 같은 것을 할 :

<%#BuildTree(Container.DataItem("ID").ToString)%> 

편집 : 함수의 DataTable의 외부를 선언는 효율성 조금 도움이됩니다.

관련 문제