2010-04-06 27 views
1

中添加我的中繼器的模板生成一個表格,其中每個項目都是一個表格行。
當滿足一個非常非常特定的條件(itemdata)時,我想從此事件向表中添加一行。從中繼器的ItemDataBound事件

我該怎麼做?

protected void rptData_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || 
     e.Item.ItemType == ListItemType.AlternatingItem) 
    { 

     bool tmp = bool.Parse(DataBinder.Eval(e.Item.DataItem, "somedata").ToString()); 
     if (!tmp && e.Item.ItemIndex != 0) 
     { 
      //Add row after this item 
     } 

    } 
} 

我可以使用e.Item.Controls.Add()並添加TableRow,但爲此我需要找到一個表的權利?
我該如何解決這個問題?

回答

5

我會把在轉發項模板控制,只有在這種情況下,其可見性設置爲隱藏&,我會告訴它...

像:

<asp:Repeater ...> 

.. 

<ItemTemplate> 

<tr> 
    <td>...</td> 
</tr> 
<tr runat="server" id="tr_condition" Visible="false"> 
    <td> Show only in specific condition </td> 
</tr> 

然後在ItemDataBound事件:

var tr_condition = e.Item.FindControl("tr_condition") as HtmlTableRow; 
tr_condition.Visible = myCondition; 

其中myCondition是獲得在特定條件設置一個標誌

HTH

+0

同意,保持視圖從代碼了。 – 2010-04-06 16:27:16

+1

是的,但這些控件將可用於控制樹中的所有項目,即使它們不可見!這不是有效的。 – nemiss 2010-04-06 16:31:14

+1

你是否分析了你的代碼,看看這是否是一個實際的效率問題? – 2010-04-06 17:07:39

0

這樣做的一種方法是在模板代碼中包含該行,並根據您的'tmp'變量設置Visible屬性。你不需要'添加'它 - 它已經在那裏了。

編輯:另一個想法 - 使用<%#%>數據綁定塊插入額外的行。爲此,您需要在ItemDataBound事件中生成<tr><td>..代碼作爲字符串。使用受保護的字符串變量 - 是這樣的:

protected string _extraRowHtml; 
中的ItemDataBound

_extraRowHtml = tmp ? "<tr><td> -- generated content -- </td></tr>" : string.Empty; 
在ItemTemplate中

<tr><td> -- regular row content --</td></tr> 
<%# _extraRowHtml %> 
+1

請看我對Sunny的回答 – nemiss 2010-04-06 16:31:45

+0

這些行不會呈現給瀏覽器,如果這是你所擔心的。 – Ray 2010-04-06 17:10:43

+0

我知道,我只是擔心控制樹...許多不必要的控制... – nemiss 2010-04-06 19:25:48

相關問題