如何动态添加额外标签控件(应仅在特定条件下添加)。 我试图做这样的事情:在某些情况下动态添加附加标签控件到<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;
}
我强烈建议不要使用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
为什么你不能在类级别声明一个名为col2Holder的变量,并希望它包含对ItemTemplate中占位符的引用,那么将会有N个ItemTemplates包含它们的唯一占位符。 – 2010-12-14 01:32:20
那么解决这个问题的好方法是什么?我确实需要仅在某些情况下生成,并非总是如此。谢谢! – 2010-12-14 01:49:50