C#中OnLoad事件和Form1_Load事件的區別


在學習《GDI+高級編程》第二章的過程中遇到一個疑問,就是為何有的代碼用的是覆寫一個OnLoad事件,而平日里我用的一般是Form1_Load事件,這兩個函數很相近,但是具體有什么關系呢?類似的代碼如下:

  OnLoad事件: protected override void OnLoad(EventArgs e)        {

            base.OnLoad(e);        }

  Form1_Load事件:private void Form1_Load(object sender, EventArgs e) {

        }

    后來查了相關的資料,參考網址:http://blog.sina.com.cn/s/blog_963217380100zw8p.html

發現原因是這樣的:

    基類中的OnLoad函數會引發事件調用Form1_Load。如果重寫了OnLoad函數但是不調用base.OnLoad(e);而是定義自己在程序加載時的操作的話那么基類中引發事件的代碼就不會被執行,也就是說Form1_Load將不會被執行。

    這樣看來,也就是可以理解成OnLoad事件包含了Form1_Load事件,或者說先有OnLoad事件后才會觸動Form1_Load事件。如果在override了OnLoad事件中提前於Form_Load寫一些預處理就會先與窗口加載代碼。下面讓我們更加深入一點理解事件的具體調用情況,來看看VS中程序啟動的事件順序:

1 - Form1 Constructor
2 - OnLoad
3 - Form1_Load
4 - OnActivated
5 - Form1_Activated

 

從上面的順序我們可以知道程序啟動按照“構造函數 - Load - Activated”的順序進行。

 

   這樣看來是不是所有的Onxxx事件都會發生在xxx事件之前呢?我又找了一些資料,發現似乎確實是這樣的,C#的編程規范中,發生xxx事件的時候通常會在Onxxx里寫實現代碼,並且可以重寫Onxxx來自定義控件。基本上是Onxxx事件先觸發事件后再把參數傳遞給xxx進行調用醬紫的。

  

    那么知道了程序啟動的事件是怎樣的順序后,再接着看看點擊關閉窗口后的退出順序,

1 - Form1 Constructor
2 - OnLoad
3 - Form1_Load
4 - OnActivated
5 - Form1_Activated
6 - OnDeactivate
7 - Form1_Deactivate

 

    可以得到點擊關閉程序后首先進行的事件為"Deactivate",但是卻沒有進入OnClosing和OnClosed中,由此我們也就明白了為什么在最初點擊'X'號后程序並不退出的原因了。那么,該怎么處理呢,很簡單,由於在點'X'號后程序進入Deactivate,因此,我們在OnDeactivate或Form1_Deactivate中調用this.close()就能進入到OnClosing和OnClosed中了,然后在OnClosing和OnClosed中做一些退出處理,就是這樣!

 

 

   最后我們看看在OnClosing事件顯示的提示窗口中點擊'ok'后程序的退出順序:

1 - Form1 Constructor
2 - OnLoad
3 - Form1_Load
4 - OnActivated
5 - Form1_Activated
6 - OnClosing
7 - Form1_Closing
8 - OnClosed
9 - Form1_Closed
10 - OnDeactivate
11 - Form1_Deactivate

 

    果然是多了OnClosing和OnClosed處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM