1

如何动态添加额外的标签控件(仅应在某些条件下添加)。我正在尝试做这样的事情:

 <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; 

但是,尽管 method1 能够正确设置 'Column1 的文本值,但它对 Column2 的值没有任何作用......我是否缺少某些东西或者有其他方法可以做到这一点?

这是method1的定义:

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;

}

4

1 回答 1

1

您需要在何时何地插入额外的控件?

您很可能应该将一个方法连接到OnItemDataBound事件,并在其中决定是否添加控件。该事件为您提供了对被绑定项目的引用,因此您可以说e.Item.Controls.Add(your_control)

更新

啊,现在我明白了你的要求。您需要向您添加另一个参数,Method1该参数需要一个DataGridItem. 当您调用 Method1 时,您可以像这样添加它,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";
}
于 2010-12-14T00:57:26.987 回答