2010-12-14 126 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

相关问题