2011-04-20 14 views
1

我目前使用這種http://blogs.sitepoint.com/hierarchical-data-database-2/存儲我的數據的方法。ASP.NET中繼器和輸出分層數據

我目前數據庫中的行是這樣的:

名稱| nodeLeft | nodeRight | nodeLevel

首頁| 1 | 6 | 1

ContentA | 2 | 5 | 2

ContentB | 3 | 4 | 2

簡介| 7 | 8 | 1

現在我使用的是ASP.NET直放站輸出使用列表和jsTree數據:

<asp:Repeater ID="rptContentSectionGetAll" runat="server"> 
     <HeaderTemplate> 
      <div id="contentSectionTree"> 
       <ul> 
        <li id="contentSectionTreeRoot" rel="root"><a href="#">Root</a> 
         <ul> 
     </HeaderTemplate> 
     <ItemTemplate> 
          <li id='<%# Eval("ID") %>'> 
           <a href="#"><%# Eval("name") %></a> 
          </li> 

     </ItemTemplate> 
     <FooterTemplate> 
         </ul> 
        </li> 
       </ul> 
      </div> 
     </FooterTemplate> 
</asp:Repeater> 

我需要更換什麼是在ItemTemplate從所有<li>的和嵌套<ul>的後面的代碼。

這是我當前的代碼背後:

private DataTable RepeaterDataSource() 
    { 
     ContentSectionBAL cBAL = new ContentSectionBAL(); 
     DataTable dTable = new DataTable(); 
     try 
     { 
      dTable = cBAL.Load(); 

      int counter = 1; 
      var htmlList = ""; 
      for (int i = 0; i < dTable.Rows.Count; i++) 
      { 
       htmlList = "<li rel='folder' id='" + dTable.Rows[i]["ID"] + "'>"; 
       htmlList += "<a href='#'>" + dTable.Rows[i]["name"] + "</a>"; 

       if (Convert.ToInt32(dTable.Rows[i]["nodeLevel"]) > counter) 
       { 
        htmlList = "<ul>"; 
        for (int j = 0; j < dTable.Rows.Count; j++) 
        { 
         if (Convert.ToInt32(dTable.Rows[i]["nodeLevel"]) > counter + 1) 
         { 
          htmlList += "<li rel='file' id='" + dTable.Rows[j]["ID"] + "'>"; 
          htmlList += "<a href='#'>" + dTable.Rows[j]["name"] + "</a>"; 
          htmlList += "</li>"; 
         } 
        } 
        htmlList += "</ul>"; 
       } 

       htmlList += "</li>"; 
       counter = counter + 1; 
      } 
     } 
     catch (Exception ee) 
     { 
      Session["message"] = ee.Message.ToString(); 
      Session["messageType"] = "error"; 
     } 

     return dTable; 
    } 

後不久,這個功能我做其綁定:

private void BindRepeater() 
    { 
     rptContentSectionGetAll.DataSource = RepeaterDataSource(); 
     rptContentSectionGetAll.DataBind(); 
    } 

所有常規節點無子女輸出:<li>name</li> 有子女需要的所有節點在某種循環中輸出所有的孩子: <li><ul><li></li></ul><li>

我有的問題: 1.通過這種類型的數據循環以正確輸出的正確方法是什麼? 2.如何成功輸出中繼器? [回答]

我知道我有什麼不會工作,但我的大腦開始油炸思考這一切。任何幫助將不勝感激。

如果你需要其他東西讓我知道,但這應該是它。

來吧夥計我需要條件或數學的幫助,以正確的順序抓住我想要的東西。

回答

0

答案是乍得和克里斯答案的結合。我最終將轉發器全部轉儲到一起,並在函數中使用了一系列條件和循環來將html保存在StringBuilder()中,並輸出到Literal

謝謝你們。

1

我們使用OnItemDataBound事件來呈現您的代碼。與

<ItemTemplate>  
    <asp:Literal ID="Literal1" runat="server"></asp:Literal> 
</ItemTemplate> 

然後在你的ItemDataBound事件處理程序打造你想要的結構爲一個字符串,並將其分配給文字Text屬性替換您的項目模板的內容。

((Literal)e.Item.FindControl("Literal1")).Text = MyNewStructureString; 
+0

這回答了我的兩個問題之一。 – balexander 2011-04-21 22:33:37

+0

另一個問題是什麼?如果你想知道如何獲得數據,我會使用遞歸函數。 – Chad 2011-04-22 20:36:58

1

您可以使用嵌套中繼器,並避免編寫所有代碼來輸出內部ul。只要您需要的列表是外部中繼器的數據項目對象的屬性,就可以聲明性地設置中繼器內的中繼器的數據源。

如果這是不可能的,因爲對象不是以這種方式構造的,您仍然可以使用嵌套的repeater方法,只需要綁定ItemDataBound事件中的每個內部中繼器即可。

+0

如果我能夠生成無限量的關卡,它會起作用嗎? – balexander 2011-04-20 16:36:45

+1

我不認爲它會工作得很好。也許你最好是創建某種遞歸函數來生成列表並將它們轉儲到文字控件中,然後直接跳過中繼器。 – 2011-04-20 17:26:14

+0

一起跳過中繼器...不是一個壞主意。我會看到我可以與之合作。謝謝你的建議。我不能標記這個正確的,因爲它只適用於兩個節點級別。 – balexander 2011-04-20 18:26:08