所有 Page_Load
事件完成后是否会触发事件?
我如何拥有多个
Page_Load
? 当你有用户控件时。
在我的网页可以呈现之前,我需要通过完成Page_Load
事件来使我的网页(以及所有嵌入式控件)初始化。
问题当然是,如果我把代码放在我的页面的Page_Load
处理程序中:
MyPage.aspx
--> Page_Load
---> DoSomethingWithUserControl()
UserControl1.ascx
--> Page_Load
---> initialize ourselves now that viewstate has been restored
然后我开始在准备好之前访问我的UserControl1
控件。
我需要一种在所有Page_Load
事件被触发后运行代码的方法,但之前任何回发事件(例如Click事件)都被触发了:
MyPage.aspx
--> Page_Load
UserControl1.ascx
--> Page_Load
---> initialize ourselves now that viewstate has been restored
MyPage.aspx
--> Page_AfterLoad
---> DoSomethingWithUserControl()
查看MSDN中的页面生命周期,看起来在完成所有Page_Loads之后无法引发事件:
在所有Page_Loads完成后,是否有办法提升之后?
答案 0 :(得分:59)
Page_LoadComplete
是在加载所有控件后引发的事件
请记住,Init
事件首先由所有子控件触发,并且只有在初始化了所有控件后,才会引发页面的Init
事件。 Load
事件以相反的方式工作,页面首先引发Load
事件,然后每个子控件引发自己的Load
事件。最后,LoadComplete
被提升。 请注意,只有在设计时创建控件时才会出现这种情况,当动态创建控件时(遗憾的是)不严格遵循此方法。
来自MSDN:
如果控件是在运行时动态创建的,或者在数据绑定控件的模板中以声明方式创建,则它们的事件最初不会与页面上其他控件的事件同步。例如,对于在运行时添加的控件,Init和Load事件可能会在页面生命周期的后期发生,而不是以声明方式创建的控件的相同事件。因此,从它们实例化时起,模板中动态添加的控件和控件会一个接一个地引发它们的事件,直到它们赶上将它添加到Controls集合中的事件。
看看:
(来源:http://msdn.microsoft.com/en-us/library/ms178472.aspx)
为了满足您的所有要求:
我需要一种方法来在所有Page_Load事件被触发后运行代码,但在任何回发事件(例如Click事件)被触发之前:
我认为最简单的方法是在用户控件中声明自定义事件并在加载控件后触发它,然后在ASPX中订阅该事件
public event Action LoadCompleted = delegate { };
protected void Page_Load(object sender, EventArgs e)
{
this.LoadCompleted();
}
protected void Page_Load(object sender, EventArgs e)
{
this.myUserControl.LoadCompleted += () =>
{
// do somethign interesting
this.lblMessage.Text = DateTime.Now.ToString();
};
}
答案 1 :(得分:1)
似乎真的没有办法可靠地让代码在所有(静态声明,参见Jupaols关于动态添加的注释)控件加载的时间和它们的回发事件被引发的时间之间执行。
我甚至使用反射器来反汇编Page类,据我所知,该页面没有调用任何可以在这些时间之间使用的方法。
因此,对于一般情况,您似乎只是运气不好。
但你的陈述
然后我开始在准备好之前访问我的UserControl1控件
值得怀疑。调用Page_Load
方法时,已在所有控件上设置了视图状态和控件状态(至少是静态声明的控件)。因此,除非您在控件的OnLoad方法中进行更多的状态初始化,否则控件已准备好进行修改。如果你在OnLoad上发生了什么事,那么为什么不在那里修补呢?