2011-04-20 4 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 지금은 출력 목록 및 jsTree를 사용하여 데이터를 ASP.NET 리피터를 사용하고 있습니다 :

나는 모든 <li> 's 및 중첩 <ul> 년대와 ItemTemplate에서 무엇을 교체 할 필요가
<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> 

코드 뒤에.

이 뒤에 내 현재 코드는 다음과 같습니다

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(); 
    } 

모든 일반 노드를 NO 어린이 출력과 아동의 요구에 <li>name</li> 모든 노드 루프의 모든 자식을 출력합니다. <li><ul><li></li></ul><li>

질문 : 1. 올바른 출력을 위해 이러한 유형의 데이터를 순환시키는 적절한 방법은 무엇입니까? 2. 리피터에서 어떻게 성공적으로 출력합니까? [답변]

나는 내가하는 일이 잘되지 않을 것이라는 것을 안다.하지만 내 뇌는 그것에 대해 생각하고 튀기 시작했다. 어떤 도움이라도 대단히 감사하겠습니다.

다른 것이 필요하면 알려주세요.하지만이 내용이 적합해야합니다.

나는 올바른 순서로 원하는 것을 얻기 위해 조건부 또는 수학에 도움이 필요합니다.

답변

0

답변은 Chad와 Chris의 답변의 조합입니다. 나는 리피터를 함께 덤핑하고, 일련의 조건문과 루프를 함수로 사용하여 StringBuilder()에 html을 저장하고 Literal으로 출력했다.

감사합니다.

1

코드를 렌더링하는 데 OnItemDataBound 이벤트가 사용됩니다. 당신하여 ItemDataBound 이벤트 핸들러 문자열로 당신이 원하는 구조를 구축하고 문자 텍스트 속성에 할당에서 다음

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

와 항목 템플릿의 내용을 교체합니다.

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

이것은 두 가지 질문 중 하나에 대한 답변입니다. – balexander

+0

다른 질문은 무엇입니까? 데이터를 어떻게 처리 하는지를 알고 싶다면 재귀 함수를 사용할 것입니다. – Chad

1

중첩 된 중계기를 사용할 수 있으며 모든 코드를 작성하여 내부 ul을 출력하지 않아도됩니다. 필요한 목록이 외부 중계기의 데이터 항목 객체의 속성 인 한 repeater 내부의 repeater의 데이터 소스를 선언적으로 설정할 수 있습니다.

개체가 이러한 방식으로 생성되지 않았기 때문에 불가능한 경우에도 중첩 된 repeater 방식을 사용할 수 있습니다. ItemDataBound 이벤트에서 각각의 내부 중계기를 바인딩하면됩니다.

+0

무한한 양의 레벨을 생성 할 수 있다면 효과가 있습니까? – balexander

+1

나는 그것이 잘 될 것이라고 생각하지 않는다. 아마도 목록을 생성하고 리터럴 컨트롤로 덤프하고 반복적으로 리피터를 건너 뛰는 일종의 재귀 함수를 만드는 것이 더 나을 것입니다. –

+0

리피터를 모두 건너 뜁니다 ... 나쁘지 않은 생각입니다. 내가 뭘 할 수 있는지 보겠다. 조언 해 주셔서 감사합니다. 나는 이것이 정확하게 두 개의 nodeLevels에서 작동하기 때문에 이것을 올바르게 표시 할 수는 없다. – balexander

관련 문제