2010-02-26 5 views
7

asp.net/C#을 사용하여 데이터베이스에서 얻은 데이터로 정렬되지 않은 목록을 렌더링해야합니다. 내 데이터는 이와 유사합니다.asp.net을 사용하여 정렬되지 않은 목록 렌더링

<ul> 
    <li>ELECTRONICS 

<ul> 

    <li>TELEVISIONS 

    <ul> 

    <li>TUBE</li> 

    <li>LCD</li> 

    <li>PLASMA</li> 

    </ul> 

    </li> 

    <li>PORTABLE ELECTRONICS 
    <ul> 

    <li>MP3 PLAYERS 

    <ul> 

<li>FLASH</li> 

    </ul> 

    </li> 

    <li>CD PLAYERS</li> 

    <li>2 WAY RADIOS</li> 

    </ul> 

    </li> 

</ul> 

</li> 

</ul> 

데이터 위 다음과 같은 형식으로, 내가 깊이에 따라 정렬되지 않은 목록을 렌더링 할 필요가 위의 샘플 데이터를 사용하여

id  Name    Depth 

1 ELECTRONICS    0 

2 TELEVISIONS    1 

3 Tube     2 

4 LCD     2 

5 Plasma     2 

6 Portable electronics 1 

7 MP3 Player    2 

8 Flash     3 

9 CD Players    2 

10 2 Way Radio   2 

내가에있는 거대한 레코드가 단지 샘플입니다 정렬되지 않은 목록으로 변환 될 수 있습니다. 누군가 이걸 어떻게 달성 할 수있는 아이디어를 주시겠습니까?

업데이트 : 다음과 같이 순서가 지정되지 않은 목록을 생성하는 코드를 업데이트했습니다. 내 순서가없는 목록은 다음과 같습니다 위의 코드와

int lastDepth = -1; 
     int numUL = 0; 

     StringBuilder output = new StringBuilder(); 


     foreach (DataRow row in ds.Tables[0].Rows) 
     { 

      int currentDepth = Convert.ToInt32(row["Depth"]); 

      if (lastDepth < currentDepth) 
      { 
       if (currentDepth == 0) 
       { 
        output.Append("<ul class=\"simpleTree\">"); 
        output.AppendFormat("<li class=\"root\"><span><a href=\"#\" title=\"root\">root</a></span><ul><li class=\"open\" ><span><a href=\"#\" title={1}>{0}</a></span>", row["name"],row["id"]); 
       } 
       else 
       { 
        output.Append("<ul>"); 
        if(currentDepth==1) 
        output.AppendFormat("<li><span>{0}</span>", row["name"]); 
        else 
         output.AppendFormat("<li><span class=\"text\"><a href=\"#\" title={1}>{0}</a></span>", row["name"], row["id"]); 
       } 
       numUL++; 
      } 
      else if (lastDepth > currentDepth) 
      { 
       output.Append("</li></ul></li>"); 
       if(currentDepth==1) 
       output.AppendFormat("<li><span>{0}</span>", row["name"]); 
       else 
        output.AppendFormat("<li><span class=\"text\"><a href=\"#\" title={1}>{0}</a></span>", row["name"], row["id"]); 
       numUL--; 
      } 
      else if (lastDepth > -1) 
      { 
       output.Append("</li>"); 
       output.AppendFormat("<li><span class=\"text\"><a href=\"#\" title={1}>{0}</a></span>", row["name"],row["id"]); 
      } 


      lastDepth = currentDepth; 
     } 

     for (int i = 1; i <= numUL+1; i++) 
     { 
      output.Append("</li></ul>"); 
     } 

.

<ul class="simpleTree"> 
<li class="root"> 
<span><a href="#" title="root">root</a></span> 
<ul> 
<li class="open" > 
<span><a href="#" title=1>ELECTRONICS</a></span> 
<ul> 
<li> 
<span>TELEVISIONS</span> 
<ul> 
<li> 
<span class="text"><a href="#" title=3>TUBE</a></span> 
</li> 
<li> 
<span class="text"><a href="#" title=4>LCD</a></span> 
</li> 
<li><span class="text"><a href="#" title=5>PLASMA</a></span> 
</li> 
</ul> 
</li> 
<li> 
<span>PORTABLE ELECTRONICS</span> 
<ul> 
<li> 
<span class="text"><a href="#" title=7>MP3 PLAYERS</a></span> 
<ul> 
<li> 
<span class="text"><a href="#" title=8>FLASH</a></span> 
</li> 
</ul> 
</li> 
<li> 
<span class="text"><a href="#" title=9>CD PLAYERS</a></span> 
</li> 
<li> 
<span class="text"><a href="#" title=10>2 WAY RADIOS</a></span> 
</li> 
</ul> 
</li></ul> 
</li></ul> 
</li></ul> 

감사합니다.

답변

3

당신은 당신의 페이지에 Literal 컨트롤에 코드에서이 같은 다음 출력 결과를 할 수있는 :

int lastDepth = -1; 
int numUL = 0; 

StringBuilder output = new StringBuilder(); 


foreach (DataRow row in yourDataTable.Rows) { 

    int currentDepth = row["Depth"]; 

    if (lastDepth < currentDepth) { 
     output.append("<ul>"); 
     numUL++ 
    } 
    else if (lastDepth > currentDepth) { 
     output.append("</li></ul></li>"); 
     numUL-- 
    } 
    else if (lastDepth > -1) { 
     output.append("</li>"); 
    } 

    output.appendformat("<li class=\"depth-{1}\">{0}", row["name"], currentDepth); 

    lastDepth = currentDepth; 
} 

for (int i = 1;i <= numUL;i++) 
{ 
    output.append("</li></ul>"); 
} 



yourLiteralControl.Text = output.toString(); 

업데이트 :이 넣어 수 있도록 나는 그것을 만든 코멘트로 요구 된 깊이에 관련한리스트 아이템상의 CSS 클래스

+0

정말 DV를 원하지만 그것은 기술적으로 올바른 진술이지만 절대적으로 권장하지는 않습니다. 거기에 컨트롤이 의미, 오히려 바인딩 전에 ForEach 루프 aspx 페이지에서이. –

+0

Chris, 왜 위의 방법을 권장하지 않습니까? – kranthi

+0

당신이 (심지어 자신의 목록에 깊이 유연한 양을 고려, 별도의 코드를 많이하지 않고이 인스턴스에서 작동합니다 확실하지 않다) 중첩의 ListView의 무리에 비해 그렇게 나쁜 생각하는 이유를 듣고 싶어요. 그리고이 foreach 루프를 코드 뒤에 또는 ASPX 페이지 자체에 넣든간에 페이지 출력을 버퍼링하지 않으면 실제로 아무런 차이가 없습니다. – patmortech

3

리피터 컨트롤을 사용하십시오.

샘플 :

MSDN Documentation

편집 : 바인딩에 대한 부분을보고, 대신 Treeview Control를 사용하여 깊이에 대한 부분을 발견하지 않았나요 데이터베이스에.

+0

리피터 컨트롤은 거의 ListView 컨트롤에서 사용되지 않습니다. –

+0

Hi Barrett, 정렬되지 않은 목록을 트리 뷰 형식으로 표시 한 후에 드래그 앤 드롭 기능을 제공하기 위해 일부 js를 적용해야합니다. 대신 treeview 컨트롤을 사용하면 가능합니까? db.If 내가 treeview로 그들을 제시하는 서버에 부하가 될 것입니다 및 포스트 백을 통해 지연을 만들 수 있습니까? – kranthi

+0

@kranthi : 끌어서 놓기 기능과 풍부한 기능을 위해 Telerik과 같은 타사 구성 요소를 사용해 볼 수도 있습니다. http://www.telerik.com/products/aspnet-ajax/treeview.aspx –

관련 문제