2012-01-31 80 views
0

我与编程创建用户控制的问题。页面加载不打在动态用户控件创建(Web窗体)

从我的测试中,增加了用户控件到另一个控件集合揭开序幕用户 控件的生命周期。具体而言,它调用控件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(); 
} 
+1

我得到你正在试图解决一个问题,你如何组织你的代码的感觉。除了自己打电话进入控制,我没有看到很多选择。你能解释一下你的实际问题吗? – NotMe 2012-01-31 02:34:41

+0

我提供的示例代码是我真正问题的简化版本。我正在尝试在用户控件中创建一个Telerik RadDock,而不是在aspx页面的代码后面执行它。 RadDockZone只能包含RadDock类型的控件,所以我创建了一个用户控件,现在我试图加载用户控件,然后将用户控件中的RadDock添加到RadDockZone.Docks集合中。我不明白为什么LoadControl()不会调用控件的生命周期事件和Controls.Add()。 – Halcyon 2012-01-31 03:33:44

回答

0

从我的研究,有没有办法触发使用LoadControl()方法的控件的生命周期事件。解决方法是,像这样创建一个名为initialize()公共方法:

var module = Page.LoadControl("~/Module.ascx") as Module; 
module.Initialize(); 

在初始化()方法,这将在Page_Load事件做任何功能可以被执行。

1

看看这篇文章:

http://msdn.microsoft.com/en-us/library/ie/ms178472.aspx#catch_up_events_for_added_controls

对于动态加载的控件,它们的事件必须被“追上”。

但在另一方面,你为什么会关心是否它添加到页面上的控制集合之前或之后发生的Page_Load?这是什么不想要的结果?

+0

正确;你基本上应该*不*编写依赖于这样的事情的代码。 – 2012-01-31 02:51:48

+0

调用LoadControl()方法时,不会调用用户控件的生命周期事件。我在Page_Load事件中放置了一个断点,除非使用Controls.Add()方法,否则它不会被命中。为什么他们不被LoadControl()方法调用? – Halcyon 2012-01-31 03:35:55

+0

从这里http://msdn.microsoft.com/en-us/library/system.web.ui.page.loadcontrol.aspx我们读到,“当你将一个控件加载到容器控件中时,容器将所有的添加控件的事件......“我想知道是否可以手动提高控件的事件,而不必将其添加到容器控件。 – Halcyon 2012-01-31 03:42:00

相关问题