我遇到了以编程方式创建的用户控件的问题。
从我的测试中,将用户控件添加到另一个控件的集合会启动用户
控制的生命周期。具体来说,它调用控件Page_Load
方法。有谁知道是否有办法开始
在调用Controls.Add()方法之前,用户控件的生命周期是
制成?
Default.aspx代码
<asp:PlaceHolder1 ID="PlaceHolder1" runat="server" />
protected void Page_Init(object sender, EventArgs e)
{
var module = LoadControl("~/Module.ascx") as Module;
// If this line of code does not execute, the Page_Load method never executes in the user control.
//PlaceHolder1.Controls.Add(module);
}
Module.ascx代码
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<%# Container.DataItem %>
</ItemTemplate>
</asp:Repeater>
protected void Page_Load(object sender, EventArgs e)
{
Repeater1.DataSource = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Repeater1.DataBind();
}
答案 0 :(得分:1)
看一下这篇文章:
http://msdn.microsoft.com/en-us/library/ie/ms178472.aspx#catch_up_events_for_added_controls
对于动态加载的控件,他们的事件必须“赶上”。
但另一方面,为什么你会关心page_load是否在它添加到页面控件集合之前或之后发生?这有什么不必要的结果?
答案 1 :(得分:0)
根据我的研究,无法使用LoadControl()方法触发控件的生命周期事件。解决方法是创建一个名为Initialize()的公共方法,如下所示:
var module = Page.LoadControl("~/Module.ascx") as Module;
module.Initialize();
在Initialize()方法中,可以执行在Page_Load事件中完成的任何功能。