Đỉnh NGUYỄN

life's a journey not a destination

Ủy nhiệm (Event Delegation) trong ASP.NET : Phát sinh sự kiện từ User Control đến Parent Page

Leave a comment


Delegate là gì? MọI ngườI thường hay gặp câu hỏI này khi còn ngồI trên ghế nhà trường và trong các cuộc phỏng vấn; câu trả lờI phổ biến là con trỏ hàm (function pointer). Trong phát triển Web, đây là kỹ thuật phổ biến để giao tiếp giữa các thành phần của Web (bản thân các hàm sự kiện của các controls được xây dựng sẵn trong ASP.NET đều dùng kỹ thuật này).

Ví dụ vớI 1 trang .ASPX và 1 User Control. User Control có 1 Button và khi click vào button này sẽ gọI 1 hàm trên trang .ASPX dùng delegate.

User Control:

C#

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Widget.ascx.cs" Inherits="Widget" %>

<asp:Button ID="btnTest" runat="server" 
    Text="I am Inside User Control" OnClick="btnTest_Click" />

Trên Widget.aspx.cs, viết xử lý sự kiện Delegate như sau:

Code-Behind

using System;

public partial class Widget : System.Web.UI.UserControl
{
    // Delegate declaration 
    public delegate void OnButtonClick(string strValue);
    // Event declaration 
    public event OnButtonClick btnHandler;
    
    // Page load 
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    
    protected void btnTest_Click(object sender, EventArgs e)
    {
        // Check if event is null 
        if (btnHandler != null)
            btnHandler(string.Empty);
        // Write some text to output 
        Response.Write("User Control’s Button Click <BR/>");
    }

}

Đoan code trên kiểm tra btnHandler khác null, phát sinh sự kiện bằng cách truyền đốI số

Trang .ASPX

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

<%@ Register Src="~/Widget.ascx" TagName="Widget" 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>
        <asp:Label ID="lblText" Text="I am On Main Page : " runat="server" />
        <asp:DropDownList ID="ddlTemp" runat="server">
            <asp:ListItem>Google</asp:ListItem>
            <asp:ListItem>Microsoft</asp:ListItem>
            <asp:ListItem>Apple</asp:ListItem>
        </asp:DropDownList>
        <br />
        <br />
        <uc1:Widget ID="Widget1" runat="server" />
    </div>
    </form>
</body>
</html>

Code-Behind

using System;

public partial class _Default : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        // Declare and Define Event of User Control. When User Clicks on button 
        //(which is inside UserControl) 
        // below event is raised as I have called raised that event on Button Click 
        Widget1.btnHandler += new
            Widget.OnButtonClick(WebUserControl1_btnHandler);
    }

    void WebUserControl1_btnHandler(string strValue)
    {
        Response.Write("Main Page Event<BR/>Selected Value: " +
                    ddlTemp.SelectedItem.Text + "<BR/>");
    }

}
Advertisements

Author: dinhnn

Senior software developer, a technical leader. You can be reached at via email to dinhnguyenngoc@gmail.com, via my blog at dinhnguyenngoc.wordpress.com, and on Twitter @dinhnguyenngoc.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s