如何动态地将控件添加到动态创建的面板?

时间:2011-07-20 21:54:52

标签: c# asp.net

我有一个可以创建n个面板的转发器。我试图动态地为每个面板添加不同的控件。我可能会以错误的方式解决这个问题。

我的代码或多或少:

的.aspx:

   <asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <% Response.Write("<asp:panel runat=\"server\" id=\"uxPanel_"); %>
        <%# DataBinder.Eval(Container.DataItem, "TableId")%><% Response.Write("\"></asp:panel>"); %>

    </ItemTemplate>
</asp:Repeater>

的.cs:

public partial class class1: System.Web.UI.Page
{
  DataSet ds= null;
protected void Page_Load(object sender, EventArgs e)
{
    GetRecords(1,1);
}

protected void GetRecords()
{
    ds= dal.LoadRecords();

    this.Repeater1.DataSource = ds.Tables[0];
    this.Repeater1.DataBind();


    Literal lit = new Literal();
    lit.Text = "Some text";
    this.FindControl("uxPanel_1").Controls.Add(lit);        


}

}

在这个例子中要清楚“dal.LoadRecords”只是调用一个从DB中检索一些记录的方法。

我认为我的问题是我首先添加我的面板,但这似乎是让它们具有唯一名称的简单方法。

任何指针?

由于

2 个答案:

答案 0 :(得分:0)

指针?是:不要动态添加控件!

动态添加控件会增加很多开销,并且会遇到视图状态问题。通常,这不值得花时间和头痛。

Panels,Literals,PlaceHolders以及所有其他ASP.NET控件都有一个Visible属性,您可以打开和关闭它,如下所示:

   myPanel.Visible=true; 
   myOtherPanel.Visible = false;
   myTogglePanel.Visible = ! myTogglePanel.Visible; //toggle it's visibility

这种方法更容易。

答案 1 :(得分:0)

正如之前的回答者所说,这充满了危险!

如果你必须:我应该完全放弃转发器方法。

创建一个容器面板或占位符,并在后面的代码中使用ContainerPanel.Controls.Add(newPanel)动态添加面板;

如果需要,您的孩子“面板”可以是UserControl。

请注意,您必须在回发时重新生成动态控件。