Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there an after Page_Load event in ASP.net

Is there an event that is triggered after all Page_Load events have completed?

How can i have more than one Page_Load?
When you have user controls.

Before my page can render, i need my page (and all embedded controls) to have initialized themselves by completing their Page_Load events.

The problem, of course, is that if i put code in my page's Page_Load handler:

MyPage.aspx    --> Page_Load           ---> DoSomethingWithUserControl() UserControl1.ascx    --> Page_Load           ---> initialize ourselves now that viewstate has been restored 

then i begin to access my UserControl1 control before it is ready.

i need a way to run code after all Page_Load events have fired, but before any postback events (e.g. Click events) have fired:

MyPage.aspx    --> Page_Load UserControl1.ascx    --> Page_Load           ---> initialize ourselves now that viewstate has been restored MyPage.aspx    --> Page_AfterLoad           ---> DoSomethingWithUserControl() 

Looking at the page lifecycle in MSDN it looks like there is no way to raise an event after all Page_Loads have been completed:

enter image description here

Is there a way to raise an after after all Page_Loads have completed?

like image 215
Ian Boyd Avatar asked Jun 27 '12 21:06

Ian Boyd


People also ask

What is the order of the events in a page life cycle?

These include initialization, instantiating controls, restoring and maintaining state, running event handler code, and rendering. It is important for you to understand the page life cycle so that you can write code at the appropriate life-cycle stage for the effect you intend.

Which page event will use in Page_Load?

Page_Load() method is called after a preLoad event.

What is the last event of web page life cycle?

UnLoad - The UnLoad phase is the last phase of the page life cycle. It raises the UnLoad event for all controls recursively and lastly for the page itself. Final cleanup is done and all resources and references, such as database connections, are freed.

How many stages are there in ASP.NET web page life cycle?

ASP.NET Page Life Cycle includes events PreInit, Init, InitComplete, OnPreLoad, Load, PostBack, LoadComplete, OnPreRender, OnSaveStateComplete, Render, and UnLoad.


1 Answers

Page_LoadComplete is the event that is raised after all controls have been loaded

Remember that the Init event is first triggered by all child controls, and just when all controls have been initialized, the Init event of the page is raised. The Load event works the other way around, the page first raises the Load event and then each child control raises its own Load event. At the end the LoadComplete is raised. Note that this is true only when the controls are created at design time, when the controls are created dynamically they (sadly) do not follow this approach strictly.

From MSDN:

If controls are created dynamically at run time or declaratively within templates of data-bound controls, their events are initially not synchronized with those of other controls on the page. For example, for a control that is added at run time, the Init and Load events might occur much later in the page life cycle than the same events for controls created declaratively. Therefore, from the time that they are instantiated, dynamically added controls and controls in templates raise their events one after the other until they have caught up to the event during which it was added to the Controls collection.

Take a look:

(source: http://msdn.microsoft.com/en-us/library/ms178472.aspx)

enter image description here

Edit 1

In order to fulfill all your requirements:

i need a way to run code after all Page_Load events have fired, but before any postback events (e.g. Click events) have fired:

I think the easiest way is to declare a custom event in the User Control and fire it after the control has been loaded, then jus subscribe to that event in your ASPX

User Control

    public event Action LoadCompleted = delegate { };      protected void Page_Load(object sender, EventArgs e)     {         this.LoadCompleted();     } 

ASPX page

    protected void Page_Load(object sender, EventArgs e)     {         this.myUserControl.LoadCompleted += () =>          {             // do somethign interesting             this.lblMessage.Text = DateTime.Now.ToString();         };     } 
like image 91
Jupaol Avatar answered Sep 21 '22 17:09

Jupaol