2017-02-21 5 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> 

現在、私は動作しますが、それだけに私を取得し、ネストされたリピータを持っています2番目のレベル。それは木を継続するためのテンプレートを持っていないので、それは動作しませんなぜ私が理解

ds.Relations.Add("relation", 
       ds.Tables("Items").Columns("ID"), 
       ds.Tables("Items").Columns("ParentID"), 
       False) 

:このようなものです

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

関係:それは次のようになります。だから私はそれを回避する方法を見つけようとしている。

私は、コードの後ろに文字列を作成し、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)%> 

EDIT:機能のDataTableの外側を宣言は、効率ビットに役立ちます。

関連する問題