我有一个可以创建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中检索一些记录的方法。
我认为我的问题是我首先添加我的面板,但这似乎是让它们具有唯一名称的简单方法。
任何指针?
由于
答案 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。
请注意,您必须在回发时重新生成动态控件。