Asp.net基礎概念之 事件

來源:互聯網
上載者:User

.NET Framework中的事件

 

事件體繫結構

引發事件的對象叫做事件來源。事件來源發布它可以引發的事件。事件的類型總是委託類型,這個委託類型的簽名定義了處理該事件的方法的簽名。定義事件處理常式方法的對象稱為事件接收方。事件接收方預訂要在事件來源上處理的事件事件接收方提供的事件處理常式方法必須與為該事件預訂的方法簽名一致。事件來源利用多播委託跟蹤這些事件處理常式方法。當發生重要情況時,事件來源引發事件,當事件引發後,事件來源自動利用它的金手委託調用在每個事件接收方上指定的事件處理常式方法。

 

事件和委託的關係

一個事件(Event)是一個對象發送的一個訊息,用來表示一個動作發生了。而一個動作可以被使用者操作或者其他程式所觸發。觸發事件的對象被事件寄件者(Event Sender)調用:捕獲處理事件的對象被事件接收者(Event Receiver)調用。

在事件通訊中,事件的寄件者不知道哪個對象或者方法將要去接收/處理髮送過去的事件。因而在事件來源和事件接收者之間就需要一個中間人存在,這個中間人就叫委託。

在使用事件的有效範圍裡,委託提供一種機制,在事件引發時為類指示要調用的方法。當事件引發時,使用委託作為被呼叫者法的指標,修改事件的類就不需要瞭解作為觀測程式的類的任何資訊。

 

定義事件

在串連事件和其處理常式方法之前,需要定義一個其他對象關心的事件。用event關鍵字和指示方法簽名的委派物件來定義事件,這個事件的所有事件處理常式都得遵循該委派物件指示的方法簽名。

 

public event EventHandler Click;

 

根據約定,引發事件的行為在OnEventName方法中發生。

 

        public void OnClick(EventArgs e)
        {
            // 如果為事件註冊了處理常式則引發該程式
            if (Click != null)
            {
                Click(this, e);
            }
        }

先進行檢查,以確定存在事件,否則值為null。接著像調用方法一樣呼叫事件來引發它,把對控制項或類的this傳遞給它,指示它作為事件的寄件者,把一個EventArgs類的新執行個體作為第二個參數。

 

使用事件

聲明了事件和它相應的委託之後,希望對事件作出響應的對象就必須為這個事件添加一個事件處理常式。事件處理常式是一個方法,它的簽名和與事件關聯的委託相匹配,當事件引發的時候被調用。 

 

Object.EventName += new DelegateType(EventHandlerMethod);

 

    注意:當指派多個處理常式給一個事件的時候,處理常式的調用次序是沒有保證的。因此不要指望處理常式會以一個特定次序出現。

 

EventHandler與EventArgs

EventHandler是.NET Framework中預定了一個用於事件的委託,它有兩個參數:object型別參數以及System.EventArgs類型的參數。Object對象代表了事件寄件者,EventArgs對象代表了事件包含的事件數目據。

其實所有的事件處理方法都只有這兩個參數,惟一不同的是,其他的某些事件處理方法的第二個參數會是System.EventArgs的一個子類,用於自訂一些我們需要的事件參數。

   

 

ASP.NET事件模型

ASP.NET的事件驅動是一種基於HTTP協議的技術,在ASP.NET中事件的觸發和事件的處理是分別在用戶端和伺服器端進行的。一個事件在用戶端被觸發之後,會通過HTTP協議以POST的方式發送到伺服器端,而伺服器端則通過ASP.NET頁面架構來進行相應的處理和反饋。

 

緩衝事件
    ASP.NET Framework提供給伺服器端事件不是很多,因為事件驅動模型機制的實現是在用戶端和伺服器端分別實現的,之間需要通過HTTP協議方式來傳遞事件資訊,因而如果頻繁地觸發各類事件會對整個Web網站產生很大的流量壓力(如OnMouseOver事件)。但是,有些事件雖然也會頻繁的觸發但是必須提供(如Change事件),對於這種情況,ASP.NET Framework提供了一個折衷的辦法,就是對於這類事件在觸發時,不是立即將事件資訊發送到伺服器,而是緩衝在用戶端,等到再一次的事件資訊被發送到伺服器端時一同發送回去。因此,當這些緩衝著的事件以及剛剛被觸發的事件在伺服器端被接收時,ASP.NET Framework不會按照特定的順序去解釋執行處理這些事件。

 

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;

/// <summary>
/// 說明:事件被緩衝的樣本
/// 作者:文野
/// 聯絡:stwyhm.cnblogs.com
/// </summary>
public partial class CacheEvent : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    
    /// <summary>
    /// 說明:文字框的TextChanged事件,不會自動引發頁面Postback
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void TextBox1_TextChanged(object sender, EventArgs e)
    {
        Response.Write("引發了文字框的TextChanged事件。<br />");
    }

    /// <summary>
    /// 說明:下拉框的SelectedIndexChanged事件,不會自動引發頁面Postback
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Response.Write("引發了下拉框SelectedIndexChanged事件。<br />");
    }

    /// <summary>
    /// 說明:按鈕的Click事件,引發頁面Postback
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Write("引發了按鈕的Click事件。<br />");
    }
}

 
    由上面的樣本我們看到,當按鈕事件引發Postback時同時被緩衝的另兩個事件也運行了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.