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.