Utilizando delegates e eventos com user controls

Depois de um dia em busca de um jeito de tratar eventos via delegates em user controls, resolvi escrever este simples artigo a fim de expor uma forma fácil que encontrei de solucionar este problema.

Pra começar vou expor o cenário do problema, e depois a solução aplicada.

O artigo encontra-se no arquivo em anexo “tutorial delegates.doc” com imagens explicativas. o arquivo “delegates.zip” contém a solução com os exemplos.

Este código foi desenvolvido utilizando C# 1.1 e VS.Net 2003.

//#####################
//arquivo.aspx
//#####################
<%@ Register TagPrefix="uc1" TagName="ucMenu" Src="ucMenu.ascx" %>
<%@ Page language="c#" Codebehind="arquivo.aspx.cs" AutoEventWireup="false" Inherits="TesteUC.arquivo" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
	<HEAD>
		<title>arquivo</title>
	</HEAD>
	<body>
		<form id="Form1" method="post" runat="server">
			<uc1_ucMenu id="ucMenu" runat="server"></uc1_ucMenu><BR>
			<asp_Label id="lblResposta" runat="server">Aqui vai aparecer a mensagem</asp_Label>
		</form>
	</body>
</HTML>

//#####################
//arquivo.aspx.cs
//#####################
using System;
using System.Web.UI;
namespace TesteUC
{
	public class arquivo : System.Web.UI.Page
	{
		protected System.Web.UI.WebControls.Label lblResposta;
		//preciso declarar a variável ucMenu para ter acesso 
		//ao web user control Menu
		protected ucMenu ucMenu;
		#region ""
		private void Page_Load(object sender, System.EventArgs e){}
		override protected void OnInit(EventArgs e)
		{
			InitializeComponent();
			base.OnInit(e);
		}
		#endregion
		private void InitializeComponent()
		{    
			this.Load += new System.EventHandler(this.Page_Load);
			//criando um handler de evento
			ucMenu.clicou+=new TesteUC.ucMenu.botao1_Handler(ucMenu_clicou);
		}
		private void ucMenu_clicou(string mensagem)
		{
			this.lblResposta.Text = mensagem;
		}

		
	}
}

//#####################
//ucMenu.ascx
//#####################
<%@ Control Language="c#" AutoEventWireup="false" Codebehind="ucMenu.ascx.cs" 
Inherits="TesteUC.ucMenu" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
<P align="left">
	<TABLE id="Table1" cellSpacing="1" cellPadding="1" width="300" border="1">
		<TR>
			<TD>
				<P align="center">User control<BR>
					<asp_Button id="botao1" Text="botao1" runat="server"></asp_Button><BR>
				</P>
			</TD>
		</TR>
	</TABLE>
</P>


//#####################
//ucMenu.ascx.cs
//#####################
namespace TesteUC
{
	using System;
	public class ucMenu : System.Web.UI.UserControl
	{
		protected System.Web.UI.WebControls.Button botao1;
		#region ""
		private void Page_Load(object sender, System.EventArgs e){}
		override protected void OnInit(EventArgs e)
		{
			InitializeComponent();
			base.OnInit(e);
		}
		private void InitializeComponent()
		{
			this.botao1.Click += new System.EventHandler(this.botao1_Click);
			this.Load += new System.EventHandler(this.Page_Load);

		}

		#endregion

		//crio o delegate que virá a tratar a mensagem
		public delegate void botao1_Handler(string mensagem);
		
		//e o evento tipado para esse delegate
		public event botao1_Handler clicou;
		
		private void botao1_Click(object sender, System.EventArgs e)
		{
			//quando o botão é clicado, preciso tratar os dados de forma a 
			//chamar o evento que irá disparar a chamada ao delegate com a função
			//na página que está no momento utilizando o web user control ucMenu
			if(clicou !=null)
				this.clicou("botao1 foi clicado no user control!!!");
		
		}
	}
}

Arquivos para Download:

tutorial delegates.docdelegates.zip

Nós queremos saber sua opinião aqui