Andrew Stevenson's WebLog

Write Here Write Now

Syndication

.Net Languages

ADO.Net

Asp.Net (Misc.)

Asp.Net Controls

Bad Patterns

Err What?

Files and Folders

Forums

IE Add-Ins

Methods for the Madness

Performance

See Clearer, C#

Test Driven

Splitting a WebForm's First Page_Load from PostBack Page_Load

Sometimes you might want to split one of the Page (or UserControl) events up.

A simple scenario is dividing the first load event (IsPostBack==false) from the load event during a postback. The code I've posted fires two additional events after/during page load. It still allows the Load event to be used, but there is some code commented out that throws an exception if you use Load. The same thing can be done with PreRender to fire some sort of PostBackEventsComplete.

The DefaultEventAttribute will cause VS.Net to emit the FirstLoad event handler instead of the Load event.

 

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

 

 

namespace AndrewTesting.ModifyPageEventStructure

{

      [DefaultEvent("FirstLoad")]

      public class PageEx :Page

      {

 

            private static readonly object FirstLoadEventKey = new object();

            private static readonly object PostBackLoadEventKey = new object();

 

            public PageEx():base()

            {

            }

            override protected void OnInit(EventArgs e)

            {

                  InitializeComponent();

                  base.OnInit(e);

                 

            }

            private void InitializeComponent()

            {   

                  this.Load += new System.EventHandler(this.Page_Load);

            }    

            private void Page_Load(object sender, System.EventArgs e)

            {

                  if(IsPostBack)

                  {

                        OnPostBackLoad(e);

                  }

                  else

                  {

                        OnFirstLoad(e);

                  }

            }

 

            virtual public void OnFirstLoad(EventArgs e)

            {

                  FireEvent(FirstLoadEventKey,e);

            }

            virtual public void OnPostBackLoad(EventArgs e)

            {

                  FireEvent(PostBackLoadEventKey,e);

            }

 

            private void FireEvent(object key,EventArgs e)

            {

                  FireEvent(key,this,e);

            }          

            private void FireEvent(object key,object sender, EventArgs e)

            {

                  EventHandler eventHandlerDelegate = (EventHandler)Events[key];

                  if (eventHandlerDelegate != null)

                  {

                        eventHandlerDelegate(sender, e);

                  } 

            }

//          new public event EventHandler Load

//          {

//                add

//                {

//                      throw new Exception("Load event not allowed");

//                }

//                remove

//                {

//                      throw new Exception("Load event not allowed");

//                }

//          }

            public event EventHandler FirstLoad

            {

                  add

                  {

                        Events.AddHandler(FirstLoadEventKey, value);

                  }

                  remove

                  {

                        Events.RemoveHandler(FirstLoadEventKey, value);

                  }

            }

 

            public event EventHandler PostBackLoad

            {

                  add

                  {

                        Events.AddHandler(PostBackLoadEventKey, value);

                  }

                  remove

                  {

                        Events.RemoveHandler(PostBackLoadEventKey, value);

                  }

            }    

      }

}

 

 

p.s. It isn't that I use or need this code; I am studying and I just need to write code from time to time.

Published Thursday, May 27, 2004 10:43 AM by AndrewSeven

Comments

No Comments