2010-04-08 36 views
3

我試圖注入中繼器項目,問題是該行在錯誤的位置生成。
如果你嘗試這個簡單的例子,你會看到在標籤'2'下產生了rown,因爲它應該在標籤'1'下產生。中繼器項目內注入錶行

爲什麼發生?以及如何解決這個問題?

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 2010-04-08 14:27:00

回答

3

我個人認爲,做一個更好的辦法是就是更換:

<%# _extraRowHtml %> 

<%# GetExtraRow(Container.DataItem) %> 

然後在後面的代碼實現:

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

然後,擺脫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後被數據綁定。

+0

我不想有一個特殊的服務控制(asp:文字),因爲rown應該生成一次...所以我不希望控件出現在他的頁面的控件樹中 – nemiss 2010-04-08 14:42:59