Categorias

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" %>


	
		arquivo
	
	
		

Aqui vai aparecer a mensagem
//##################### //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="https://schemas.microsoft.com/intellisense/ie5"%>

User control

//##################### //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