2010-12-14 28 views
1

如何動態添加額外標籤控件(應僅在特定條件下添加)。 我試圖做這樣的事情:在某些情況下動態添加附加標籤控件到<ItemTemplate>

<asp:DataGrid id="dg" runat="server" AutoGenerateColumns="false"> 
<Columns> 
    <asp:TemplateColumn SortExpression="Column1"> 
     <HeaderTemplate> 
     <asp:LinkButton Runat="server" text="Column1 Hdr" ID="col1Hdr"> 
     </asp:LinkButton> 
     </HeaderTemplate> 
     <ItemTemplate> 
     <asp:Label ID="col1Label" runat="server" Text='<%# Method1(DataBinder.Eval(Container.DataItem, "Column1").ToString(), DataBinder.Eval(Container.DataItem, "Column2").ToString()) %>' >   
      <asp:PlaceHolder ID="col2Holder" runat="server"></asp:PlaceHolder> 
     </asp:Label> 
     </ItemTemplate>  
    </asp:TemplateColumn> 
</Columns> 
</asp:DataGrid> 

另外,我試圖把佔位符在一個單獨的模板:

<EditItemTemplate> 
     <asp:PlaceHolder ID="col2Holder" runat="server"></asp:PlaceHolder> 
    </EditItemTemplate> 

,但無濟於事。 關於如何在某些情況下(如Column1/Column2的某些值)創建佔位符的任何提示,而不是選擇中繼器方法... 我得到一個空引用異常,但是當我不得不明確提到:

protected PlaceHolder col2Holder = new Placeholder(); 

,而不是

protected PlaceHolder col2Holder; 

不過,雖然方法1是能夠正確地設置了「Column1中的文本價值,它無助於將Column的價值... 有什麼事我缺少或有沒有不同的方式來做到這一點?

這裏是方法一的DEFN:

public string Method1(string col1, string col2) 
{ 
    col1 += "Called method1"; 
    Label col2label= new Label(); 

    col2label.Visible = true; 
    col2label.Text = col2;   

    col2Holder.Controls.Add(col2label); 
    col2Holder.DataBind(); 

return col1; 

}

+0

我強烈建議不要使用DataBinder.Eval - 它的緩慢和邪惡。最好轉換爲正確的類型並直接獲取數據。 (DataRow)Container.DataItem)[「Column1」],而不是DataBinder.Eval(Container.DataItem,「Column1」)。如果要將其轉換爲DataSource,那麼您應該寫((DataRow)Container.DataItem)[「Column1」]而不是DataBinder.Eval(Container.DataItem,「Column1」) – 2010-12-14 01:20:46

+1

爲什麼你不能在類級別聲明一個名爲col2Holder的變量,並希望它包含對ItemTemplate中佔位符的引用,那麼將會有N個ItemTemplates包含它們的唯一佔位符。 – 2010-12-14 01:32:20

+0

那麼解決這個問題的好方法是什麼?我確實需要僅在某些情況下生成,並非總是如此。謝謝! – 2010-12-14 01:49:50

回答

1

在哪裏,當你需要額外的控制要插入?

您應該最有可能將方法連接到OnItemDataBound事件,並在那裏決定是否添加控件。本次活動爲您提供了該項目的引用被綁定,所以你可以說e.Item.Controls.Add(your_control)

更新

啊,現在我明白了你問什麼。您需要爲您的Method1添加另一個參數,需要DataGridItem。當您撥打方法1時,請將其添加爲Method1(Container),其中Container指的是DataGridItem。然後你就可以在Method1

public string Method1(DataGridItem item) 
{ 
    string col1 = DataBinder.Eval(item.DataItem, "Column1").ToString(); 
    string col2 = DataBinder.Eval(item.DataItem, "Column2").ToString(); 

    var col2label = new Label() { Visible = true, Text = col2 }; 
    var col2Holder = item.FindControl("col2Holder"); 

    col2Holder.Controls.Add(col2label); 

    return col1 + "Called method1"; 
} 

順便說一句說,你不能添加任何控件到一個標籤,你的ItemTemplate看起來應該是這樣

<ItemTemplate> 
    <asp:Label ID="col1Label" runat="server" Text="<%# Method1(Container) %>" /> 
    <asp:PlaceHolder ID="col2Holder" runat="server" /> 
</ItemTemplate> 

如果你想在新的標籤要內嵌套第一個標籤,你應該做的明確的方法,並省略佔位符:

<ItemTemplate> 
    <asp:Label ID="label" runat="server" Text="<%# Method1(Container) %>" /> 
</ItemTemplate> 

public string Method1(DataGridItem item) 
{ 
    string col1 = DataBinder.Eval(item.DataItem, "Column1").ToString(); 
    string col2 = DataBinder.Eval(item.DataItem, "Column2").ToString(); 

    var label = item.FindControl("label"); 
    var col2label = new Label() { Visible = true, Text = col2 }; 

    col1Holder.Controls.Add(col2label); 

    return col1 + "Called method1"; 
} 
+0

我想將額外的控件插入 元素中,可以是div或跨度。應該通過檢查Column1 =「something」的值以及Column2!= null ....的值來插入,例如,如果傳入數據庫中的兩個值並添加新的控件(如果有效的值)。 – 2010-12-14 00:59:47

+0

更新了我的答案,並介紹瞭如何將對ItemTemplate的引用傳遞給您的方法,以便您可以向其中添加新控件。 – 2010-12-14 01:07:23

+0

當你說Item時你的意思是正確嗎?思考如何現在可以調用這種方法..使用Id或什麼? – 2010-12-14 01:14:13