Asp.net基础概念之 事件
.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時同時被緩存的另兩個事件也運行了。
轉載于:https://www.cnblogs.com/Little-Li/archive/2010/07/16/1779125.html
總結
以上是生活随笔為你收集整理的Asp.net基础概念之 事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在一个禁止离婚的国家结婚
- 下一篇: ActiveBpel部署运行BPEL流程