ASP.NET自定義控件組件開發 第三章 爲控件添加事件 後篇

                                                   第三章 爲控件添加事件 後篇

 

           前一篇文章只是簡單的說了下事件,但是大家應該方法,在ASP.NET自定義控件中只是簡單那麼定義事件是行不

 

通。如果大家開發的是WinForm中的事件,之前的定義可能沒有什麼大的問題,只是在效率方法欠考慮而且,還是可以運行

 

的。

 

          下面我們就回到ASP.NET中的事件。

 

          大家也許看了我們之前定義的事件,確實,事件一般是那麼定義的,但是那樣定義事件後的,運行起來的效率不搞,

 

因爲那樣定義事件後,編譯器在編譯事件代碼的時候,會自動的爲我們加入很多多線程安全的代碼,就是說,雖然我們只是

 

定義幾行代碼,大但是編譯器爲我們做了很多額外的事情,當然,這樣代碼的運行的效率可想而知。

 

     在很多的時候,我們自定義控件的事件不是需要考慮多線程安全等問題的,所我們就要改變代碼,使其運行的更加好,

 

我們就採用下面的方法:顯示的申明事件:

 

 

 

 

Code

     注意:其實就我們之前定義的事件的代碼而言,編譯器在在編譯我們的代碼的時候,也是編譯成了上面的形式而且還額外

 

的加上了一些安全的控制代碼,這裏,我們現在不要編譯器生成,而是我們自己寫出來,效率就高了。

 

     還有就是:如果一個事件在事件列表(是一個hashtable)已經註冊了,當頁面上有兩個相同我們自定義控件,我的控件

 

的事件也只是在註冊一次,效率也高了。

 

          到這裏一個事件就定義好了。

 

          現在做的事情就是要觸發事件。即,點擊“提交”按鈕,就觸發。

 

          我們先了理解一下流程:

 

               點擊“提交”,整個頁面就向服務器提交了,之後就開始了頁面的生命週期。

                         1.對頁面進行解析,將原來頁面中的源,如<asp:....></asp>這樣的標記解析成相應的html代碼,當

 

把頁面解析完之後,頁面在服務器就是html的樣式了。(我這裏說的很粗略,沒有必要說的那麼詳細)。

 

                    2.解析後的頁面就開始檢查,剛纔是哪個控件引發的服務器回傳,即,是點擊了哪個按鈕後,整個頁面向服

 

務器提交的,我們這裏就是那個“提交”按鈕。

 

                    3.解析後的頁面檢查“提交”按鈕的name是否和控件(CreditCardForm)的name相同,如果相同。再檢

 

查控件 CreditCardForm實現了IPostBackEventHandler接口,如果實現了,就引發我們之前定義的事件。

 

                    這樣,我們的控件就和真正的服務器控件沒有兩樣了。

(注意:上面的第3點:我們要按鈕的name和CreditCardForm的name一樣,這裏的name我們無法用自己手動來設置他們

 

的一樣,因爲CreditCardForm的名字是有頁面來設置的,頁面將其設置爲:this.UniqueID,所以我們只能將按鈕的名字設置

 

爲this.UniqueID,這樣就可以了),所以我們要重寫CreditCardForm5的一些屬性:

 

      

Code

 

          還有,每一次頁面提交給服務器後,解析頁面的this.UniqueID都不一樣。而且,如果在頁面中同時有兩個CreditCardForm,我們也要保證兩個控件的其他控件,如輸入框等等的name也不一樣,所以要分別重寫name。

      

Code

 

          這裏以後,下面我們就只要實現IPostBackEventHandler接口,就可以調用我們的事件了,實現IPostBackEventHandler接口,其實只有一個方法。而且也很簡單,代碼:

 

     

Code

 

 

     這樣以後,我們的控件就可以引發服務器回傳了,即,當你點擊“提交”按鈕時,我們的瀏覽器的狀態欄下面就有刷新的

 

進度條了。

 

          注意,還有一個問題啊,我們確實能夠使得我們的控件向服務器提交信息,但是服務器怎麼來得到我們的提交的信息

 

呢?

 

     並不是我們把信息向服務器提交後,就什麼都不管了,然後服務器就”很聽話的“進行驗證。不是這樣的,起碼我們還要

 

告訴服務器,我們提交了哪些要被驗證的信息。

 

     那麼服務器這樣接受到我們的信息,,很簡單,只要實現一個接口就可以了--IPostBackDataHandler。

 

     接口有兩個方法,第一個就是LoadPostData方法,就是來獲取我們的信息,並且判斷我們這次提交的信息和上次有變化

 

沒有。

 

     上面的方法返回一個布爾的值,如果返回true,就自動的調用下一個方法RaisePostDataChangedEvent,

 

     大家可以根據方法的英文看到他們的作用。

 

       這裏我們只是講下LoadPostData方法,方法的完成寫法是這樣的:

     

Code

 

 

 

 

 

 

     看見方法不要害怕,方法的參數,前一個參數,我們不要管,只要看看後面的參數就可以了。

     

     我們的信息的提交,都是在相應的輸入框,下拉框中寫好了,傳給服務器的,其實是以:鍵值對,傳了的.

     

     鍵:就是我們輸入框等的名字,name

     值:就是輸入的值。

 

     其實NameValueCollection就是一個哈希表,來存放鍵值對的。

 

     我們之前的所有輸入的信息被包含成了一個NameValueCollection傳到服務器,然後服務器就通過對應的“鍵”(name)來獲取值,然後驗證。

 

 

 

     代碼如下:

 

Code

 

 

 

     這樣,我們整個控件就寫完了,不知道大家懂了沒:有問題回覆!完整代碼如下:

     

Code
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章