本章內容
5.1 控件事件和數據回發概述
5.2 事件和數據回發機制的實現
5.3 復合控件的事件處理機制
5.1 控件事件和數據回發概述
在講解實現控件事件和數據回發功能之前,有必要先了解一下相關的基本概念。
5.1.1 事件及其意義
要為控件定制事件,先得使用控件的事件。首先以經典的Button控件的OnClick事件為例子,說一下事件的使用模型。
1.注冊事件
<asp:Button ID="Button1" runat="server"OnClick="Button1_Click"Text="Button"/>
或在Page_Load中注冊:
protected void Page_Load(object sender, EventArgs e)
{
this.Button1.Click +=new EventHandler(Button1_Click);
}
2.事件方法體
protected void Button1_Click(object sender, EventArgs e)
{
}
首先從事件要實現的功能角度理解事件。我們把按鈕(Button)看做一個對象,把頁面(Page)也看做一個對象。
正向理解:假如我們在Page對象中要修改Button的行為,可以直接通過this.Button1的形式直接訪問Button對象的屬性或方法對 Button進行修改,可以理解為Page類能訪問到Button代碼功能。原因是Button1是Page類內部的一個對象,類當然可以直接訪問其內部的對象。
逆向理解:假如我們需要在Button中要訪問Page中的代碼呢?直接像上面那樣通過this.Page的形式是不行的,因為 Button是Page類的內部對象,但Page不是Button類的內部對象,從面向對象角度講,類(Button)不能訪問其外部的對象(Page),也就是說在Button中不可能通過this.Page的形式訪問到Page對象。而使用事件機制就可以解決此問題,即事件機制解決了面向對象編程中不允許類訪問類外部代碼問題。關於事件的應用本章後面會專門講解,在這裡僅介紹一下它的功能。
更深層了解一下Button的事件:假如我們沒有對Button注冊Click事件,則Button會執行一遍它內部的Click相關邏輯,並沒有對Page對象產生任何影響;如果我們為Button定義了Click事件(如上面代碼片段),則Button還是執行一遍它內部的Click相關邏輯,不同的是在執行自己內部邏輯的過程中它還執行了Page對象中的一些代碼功能(即Button的事件體Button1_Click方法),就達到了我們要實現的功能。通過觸動一個對象 Button影響到另一個對象Page的行為,並且在Button的事件體中即可以修改Button本身(通過sender或 this.Button1),也可以修改Page頁面對象的其他控件或執行任意想要的代碼功能。
其次從ASP.NET工作機制說一下它的工作原理,與桌面應用程序中的事件不同,ASP.NET服務器控件事件是在服務器上引發和處理的。當Web請求將客戶端操作發送到服務器時,控件可以在服務器上引發事件來響應客戶端操作。該頁或其子控件對事件進行處理,然後ASP.NET將響應發送回客戶端。這樣,用戶感覺就像在使用桌面應用程序一樣。但是,控件開發人員必須了解只有一個客戶端事件發送到服務器,即回發事件。
有些在客戶端執行的事件(如JavaScript定義的客戶端事件)沒有被發送到服務器,不能被服務端處理,這樣的事件不是我們這一章要講的事件,本章講的是服務器控件事件,是由服務器來處理的事件。