2009-02-03 3 views
4

databound asp : repeater 컨트롤의 필드 변경시 하위 헤더 행을 표시하는 방법이 있습니다.asp : repeater - 섹션 변경시 헤더

대신

 
country | colour | number 
uk | red | 3 
uk | green | 3 
france | red 3

의이 작업을 수행합니다 : 어떤 도움

 
==UK== 
colour | number 
red | 3 
green 3 
==FRANCE== 
colour | number 
red | 3

많은 감사합니다.

답변

0

는 dotnetjunkies 코드에서 몇 가지 버그 것 같다하지만 난 여기에 훨씬 더 간단한 해결책 이제 http://www.west-wind.com/weblog/posts/140753.aspx

당신이 당신의 자신에이 작업을 수행 할 수 있도록 중계기, 그룹화를 지원하지 않는 발견했지만, 그건 꽤 쉽게 할 수 있습니다. 다음 데이터 표현 위의 중계기에서 그룹화에 대한 책임 :

<%# this.RenderGroup(Eval("Group") as 
string) %> 

표현은 별도의 div 태그를 렌더링하는 형태의 메소드를 호출합니다. 이 간단한 코드의 코드는 다음과 같습니다.

string LastGroup = "@#@~"; 
protected string RenderGroup(string Group) { 
    if (Group == this.LastGroup)  
    return "";  // *** Group has changed  
    this.LastGroup = Group;  
    return "<div class='groupheader'>" +Group + "</div>"; 
} 

이 코드는 모든 항목에 대해 호출되며 단순히 그룹이 변경되었는지 확인합니다. 아무 것도 반환하지 않으면 간단한 div 태그가 마크 업에 포함 할 문자열로 반환됩니다. HTML을 다시 전송하기로 결정했지만, true 나 false를 반환하고 조건부로 CSS Nazis를 더 행복하게 만들 리피터에 컨트롤을 렌더링 할 수 있다고 가정합니다.

0

아 - 그룹화 중계기를 사용 중입니다. 내가 과거에 적응시킨 solution이 사라진 것으로 보인다. 어쩌면 당신은 그것을 찾을 수 있습니다. 그러나 어쨌든 중계기 그룹화에 대한 검색이 도움이됩니다.

+0

건배, 그게 내가 원하는거야. – ctrlalt3nd

+0

그 기사는 더 이상 작동하지 않습니다. – NotMe

5

기본 제공 지원은 없지만 이것이 불가능하다는 의미는 아닙니다.

당신은 OnItemDataBound 이벤트를-타고 이상으로해야하고, 마크 업에서이 같은해야합니다

:에서 다음

<asp:Repeater OnItemDataBound="NextItem" ... > 
    <ItemTemplate><asp:Literal Id="Header" Visible="False" Text="{0}<strong>{1}</strong><br/><table>" ... /> 
     <tr> 
      <td><asp:Label id="Color" Text="<%# Eval("Color")" ... /></td> 
      <td><asp:Label id="Number" Text="<%# Eval("Number")" ... /></td> 
     </tr> 
    </ItemTemplate> 
</asp:Repeater></table> 

을 코드 숨김 :

조엘 용액에
private string CurCountry = string.Empty; 

private void NextItem(object sender, RepeaterItemEventARgs e) 
{ 
    if (e.Item.ItemType != ListItemType.Item 
     && e.Item.ItemType != ListItemType.AlternatingItem) return; 

    DbDataRecord row = (DbDataRecord)e.Item.DataItem; 

    if (CurCountry != row["country"].ToString()) 
    { 
     string prev = (CurCounter == string.Empty)?"":"</table>"; 
     CurCountry = row["country"].ToString(); 

     Literal header = (Literal)e.Item.FindControl("Header"); 
     Literal footer = (Literal)e.Item.FindControl("Footer"); 

     header.Text = string.Format(header.Text, prev, CurCountry); 
     header.Visible = true; 
    } 
} 
+0

감사합니다! 이것은 나를 위해 일했다. – Eden

0

, I 다음과 같은 조언을 할 수있다 - 변경이 라인 :

header.Text = string.Format("<strong> {0} </strong><br/><table>", CurCountry); 

로를
header.Text = string.Format(header.Text, CurCountry); 

그리고 & 느낌을 .as? x 파일에서 사용자 정의 할 수 있습니다.

1

또 다른 솔루션은 두 개의 중계기를 하나씩 중첩시키는 것입니다. 하위 레코드가있는 그룹을 첫 번째 repeater로 전달하고 그룹 repeater의 ItemDataBound에 하위 레코드를 하위 repeater로 전달하고 DataBind()를 호출 할 수 있습니다.

이 코드는 더 많은 코드이지만 실제로 코드 숨김에 HTML 작성 코드가 없어도 레이아웃을 제어 할 수 있습니다.

여기에서 볼 수 있듯이 우리는 부모 리피터를 가지고 있으며 항목 템플릿에 각 그룹을 사용자 정의 할 수 있습니다.ChildRepeater에는 그룹화 된 각 항목을 사용자 정의 할 수있는 항목 템플릿이 있습니다. 매우 깨끗하고 선언적 UI가 모두 있습니다. 코드에서

<asp:Repeater runat="server" id="GroupRepeater"> 
<ItemTemplate> 
    <asp:Literal runat="server" id="HeaderText" /> 
    <asp:Repeater runat="server id="ChildRepeater"> 
    <ItemTemplate> 
     <asp:Literal runat="server" id="InfoGoesHere" /> 
    </ItemTemplate> 
    </asp:Repeater> 
</ItemTemplate> 
</asp:Repeater> 

우리는이 같은 수의 뒤에 :

private void GroupRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    //Get the child records, this can be any data structure you want 
    SomeChildCollection children = ((SomeGroupCollection)e.Item.DataItem).Children; 
    //Find the child repeater 
    Repeater childRepeater = e.Item.FindControl("ChildRepeater") as Repeater; 
    childRepeater.ItemDataBound += SomeMethod; 
    childRepeater.DataSource = children; 
    childRepeater.DataBind(); 
} 

당신이하여 ItemDataBound 이벤트를 구독 할 수 있습니다 각 어린이 바인딩 후를 당신이 맞는 볼 컨트롤에 바인딩 아이를 않습니다.

+0

+1 중첩 된 중계기. 이 기사는 본질적으로이 답변과 동일하지만 다른 사용자에게 도움이 될만한 비슷한 설명을 제공합니다. http://www.codeproject.com/KB/aspnet/AspNetNestedRepeaters.aspx – bkaid

관련 문제