Thursday, July 3, 2008

Event and Delegates -Capture Master Page Events in Content Pages

In This article, I explain how to use event and delegate to capture Master page event at content page.
Case :The master page (MasterPage.master.cs) Content drop down list .When The dropdown selected index change the selected value must be display in content page labels.
How to Do:
1. we develop master page as usual .Then top of code behind page of the master page, we have to declare Delegate and also have to declare public event in the class which type of previous delegate .Next step is declaring virtual method that used to handle the event ,Then we have to call the above method at the event of controller(drop down list ).
2.Develop content page and put following code at the top of .aspx page
3. In the code behind file of content page we have to write method capture to the master page event and in the page load event we have to add event handaler to call .
MasterPage.master.cs
This is Master Page with content Drop down list

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns= " http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Master test</title>
</head>
<body>
<form id="form1" runat="server">
<div style="width: 158px; height: 414px; background-color: gray">
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" Width="150px">
<asp:ListItem Value="a"></asp:ListItem>
<asp:ListItem>b</asp:ListItem>
<asp:ListItem>c</asp:ListItem>
</asp:DropDownList>
</div>
<div style="left: 168px; width: 638px; position: absolute; top: 17px; height: 410px">
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
</html>

class MasterPage
Then Put following codes in page behined file of the master page

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//declare delegates for Master Page Events
public delegate void mstDelegate(object sender, System.EventArgs e);
public partial class MasterPage : System.Web.UI.MasterPage
{

private string slectedValue;
public string SlectedValue
{
get { return slectedValue; }
set { slectedValue = value; }
}
// declare Public Events type of above delegate
public event mstDelegate DropDownEvent;
protected void Page_Load(object sender, EventArgs e)
{

}
// impliment virtual method to handel above event
protected virtual void OnDropDownClick(EventArgs e)
{
if (DropDownEvent != null)
{
//Invokes the delegates.
DropDownEvent(this, e);
}
}
// DropDownList1_SelectedIndexChanged event
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
SlectedValue = DropDownList1.SelectedValue;
OnDropDownClick(e);
}

}

Create Test page
testevent.aspx

<%@ MasterType virtualPath="~/MasterPage.master"%>
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="testevent.aspx.cs" Inherits="testevent" Title="test Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:Label ID="lblOutput" runat="server" Text="Label" Width="244px"></asp:Label>
</asp:Content>
Code behind file of test page
Testevent.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class testevent : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{
// create instant of Master event
Master.DropDownEvent += new mstDelegate(mstDDLClick);

}
/// method for catch Master Page menu click event
void mstDDLClick(object sender, EventArgs e)
{
lblOutput.Text = Master.SlectedValue;
}

}