2010-04-08 4 views
3

리피터 항목을 삽입하려고하는데 문제는 행이 잘못된 위치에서 생성된다는 것입니다.
이 간단한 예제를 사용하면 '1'레이블 아래 생성되어야하므로 '2'레이블 아래에 rown이 생성된다는 것을 알 수 있습니다.리피터 항목 내부 테이블 행 삽입

왜 발생합니까? 그리고 그것을 고치는 방법?

protected void Page_Load(object sender, EventArgs e) 
{ 
    int [] array = {1,2,3,4,5}; 
    rpt.DataSource = array; 
    rpt.DataBind();  
} 

protected string _extraRowHtml; 
protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || 
      e.Item.ItemType == ListItemType.AlternatingItem) 
    {   
     int tmp = ((int)e.Item.DataItem); 
     _extraRowHtml = tmp == 1 ? "<tr><td class=\"topicsRow\" colspan=\"100%\"> Topics </td></tr>" : string.Empty; ;     

    } 
} 

<asp:Repeater ID="rpt" runat="server" onitemdatabound="rpt_ItemDataBound"> 
    <HeaderTemplate> 
     <table cellpadding="0px" cellspacing="0">    
    </HeaderTemplate>    
    <ItemTemplate>  
     <tr style="height:50px">    
     <td> 

      <asp:HyperLink ID="lnkTitle" runat="server" Text='<%# Container.DataItem%>'/>    
     </td>    
     </tr> 
     <%# _extraRowHtml %> 
    </ItemTemplate>   
    <FooterTempl 
    </table> 
    </FooterTemplate> 
</asp:Repeater> 
+0

어떤 라벨을 언급하고 있습니까? – hunter

답변

3

내가 일을 더 좋은 방법이 생각은 대체하는 것입니다 rpt_ItemDataBound 함수 (및 해당 onItemDataBound).

1

이 방법으로 변수를 사용하면 완전히 제어 할 수있는 것이 아니기 때문에이 방법으로 오류가 발생하기 쉽습니다.

내가 할 수있는 것은 템플릿에 다음과 같은 것을 추가하는 것입니다.

<asp:literal id="litExtraRow" runat="server" mode="Passthrough" /> 

은 다음 항목 바인딩 이벤트에 귀하의 코드 숨김이 같은

if (((int)e.Item.DataItem) == 1) 
{ 
    ((Literal)e.Item.FindControl("litExtraRow")).Text = "Your HTML Here"; 
} 

뭔가 좀 더 신뢰할 수 있어야합니다.

문제가 발생하는 이유는 템플릿이 "ItemDataBound"가 호출 된 것처럼 값이 평가되고 행 1, 값이 string.Empty이고 두 번째 행에 대해 항목 1이 데이터 바인딩 된 후입니다. 그런 다음

protected string GetExtraRow(object Data) 
{ 
    int tmp = (int) Data: 
    return _tmp == 1 ? 
     "<tr><td class=\"topicsRow\" colspan=\"100%\"> Topics </td></tr>" : 
     string.Empty; 
} 

및 제거하기 : 뒤에 구현

<%# _extraRowHtml %> 

코드에서 다음

<%# GetExtraRow(Container.DataItem) %> 

으로 : 개인적으로

+0

rown을 한 번 생성해야하기 때문에 특별한 서브 컨트롤 (asp : literal)을 사용하고 싶지 않습니다 ... 그래서 컨트롤이 페이지의 컨트롤 트리에 나타나지 않게하고 싶습니다. – nemiss