Criando eventos personalizados em UserControl no ASP.NET

Nem sempre os componentes atuais do ASP.NET atendem por completo as nossas necessidades. Com isso muitas vezes precisamos implementar funcionalidades e que também na maioria das vezes necessitam ser reutilizadas. O funcionalidade de um UserControl, é essa, criar controles personalizados que possam ser reutilizados.

É esse o objetivo desse artigo de hoje, criar um UserControl que possua funcionalidade que possam ser reutilizadas como se fosse um componente.

Para dar inicio, abra o Visual Studio, crie um novo WebSite. No Meu caso estou usando o Visual Studio 2010, mais pode ser qualquer versão.

Como exemplo, vou criar um UserControl que tem como funcionalidade autenticar e receber o login e a senha do usuário. Nele incluirei 2 Labels, 2 TextBox, 1 LinkButton e 2 Button. E ficará da seguinte formar.


<asp:Panel ID="pnlLogin" runat="server" GroupingText="Login">
    <asp:Label ID="lblUsuario" runat="server" Text="Usuario" /><br />
    <asp:TextBox ID="txtUsuario" runat="server" /><br />
    <asp:Label ID="lblSenha" runat="server" Text="Senha" /><br />
    <asp:TextBox ID="txtSenha" runat="server" TextMode="Password" /><br />
    <br />
    <asp:LinkButton ID="lnkEsqueceuSenha" runat="server" Text="Esqueceu a senha?" />
    <br />
    <br />
    <asp:Button ID="btnAutenticar" Text="Autenticar" runat="server" />
    <asp:Button ID="btnCadastrar" Text="Cadastrar" runat="server" />
</asp:Panel>

Com esse código já temos a tela de login, porem não o mais importante que são os eventos. Para que ele seja funcional, iremos atribuir eventos aos Botões e possibilitar que um WebForm recupere a ação do usuário por meio do evento acionado. Para iniciar criamos o evento Click dos botões e do LinkButon.


<asp:Panel ID="pnlLogin" runat="server" GroupingText="Login">
    <asp:Label ID="lblUsuario" runat="server" Text="Usuario" /><br />
    <asp:TextBox ID="txtUsuario" runat="server" /><br />
    <asp:Label ID="lblSenha" runat="server" Text="Senha" /><br />
    <asp:TextBox ID="txtSenha" runat="server" TextMode="Password" /><br />
    <br />
    <asp:LinkButton ID="lnkEsqueceuSenha" runat="server" Text="Lembrar senha" OnClick="lnkLembrarSenha_Click" />
    <br />
    <br />
    <asp:Button ID="btnAutenticar" Text="Autenticar" runat="server" OnClick="btnAutenticar_Click" />
    <asp:Button ID="btnCadastrar" Text="Cadastrar" runat="server" OnClick="btnCadastrar_Click" />
</asp:Panel>


protected void btnAutenticar_Click(object sender, EventArgs e)
{

}

protected void lnkLembrarSenha_Click(object sender, EventArgs e)
{

}

protected void btnCadastrar_Click(object sender, EventArgs e)
{

}

Se você tentar recuperar o evento do botão Autenticar por exemplo vai ver que não será possível, para isso vamos criar agora os eventos necessários.


// Delegate
public delegate void AutenticarEventHandler(object sender, System.EventArgs e);
public delegate void LembrarSenhaEventHandler(object sender, System.EventArgs e);
public delegate void CadastrarEventHandler(object sender, System.EventArgs e); 
    
// Event
public event AutenticarEventHandler Autenticar;
public event LembrarSenhaEventHandler LembrarSenha;
public event CadastrarEventHandler Cadastrar;

Criamos um Event e um Delegate para cada Button e LinkButton e é por meio do evento Click deles que faremos a chamada desses Eventos personalizados.


protected void btnAutenticar_Click(object sender, EventArgs e)
{
    if (Autenticar != null) Autenticar(sender, e);
}

protected void lnkLembrarSenha_Click(object sender, EventArgs e)
{
    if (LembrarSenha != null) LembrarSenha(sender, e);
}

protected void btnCadastrar_Click(object sender, EventArgs e)
{
    if (Cadastrar != null) Cadastrar(sender, e);
}

Agora que temos nosso UserControl, abra o Default.aspx em modo designer e arraste o UserControl para ele e adicione um Label.


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ Register src="LoginControl.ascx" tagname="LoginControl" tagprefix="uc1" %>

<!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></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <uc1:LoginControl ID="LoginControl1" runat="server" />
        <br />
        <asp:Label ID="lblResultado" runat="server" ForeColor="Red"></asp:Label>
    </div>
    </form>
</body>
</html>

Para finalizar, vamos criar os eventos necessarios no CodeBehind do Default.aspx para que nosso exemplo funcione.


protected void Page_Load(object sender, EventArgs e)
{
    LoginControl1.Autenticar += new LoginControl.AutenticarEventHandler(LoginControl1_Autenticar);
    LoginControl1.LembrarSenha += new LoginControl.LembrarSenhaEventHandler(LoginControl1_LembrarSenha);
    LoginControl1.Cadastrar += new LoginControl.CadastrarEventHandler(LoginControl1_Cadastrar);
}

// Evento Autenticar
protected void LoginControl1_Autenticar(object sender, EventArgs e)
{
    lblResultado.Text = "Evento [AUTENTICAR]";
}

// Evento Lembrar Senha
protected void LoginControl1_LembrarSenha(object sender, EventArgs e)
{
    lblResultado.Text = "Evento [LEMBRAR SENHA]";
}

// Evento Cadastrar
protected void LoginControl1_Cadastrar(object sender, EventArgs e)
{
    lblResultado.Text = "Evento [CADASTRAR]";
}

Assim, temos o resultado abaixo.

Muito pode ser feito com o uso de Eventos e UserControl e alem do mais, podemos reutilizar e compartilhar os códigos criados.

Deixarei para download o projeto criado: [download id=”6″ format=”2″].

Abraço e até a próxima.