创建动态用户控件期间页面加载未命中(Web窗体)

时间:2012-01-31 00:00:58

标签: c# asp.net webforms

我遇到了以编程方式创建的用户控件的问题。

从我的测试中,将用户控件添加到另一个控件的集合会启动用户 控制的生命周期。具体来说,它调用控件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();
}

2 个答案:

答案 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事件中完成的任何功能。