OnLoad事件和Form1_Load事件的区别

Posted Lin_chun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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处理。

以上是关于OnLoad事件和Form1_Load事件的区别的主要内容,如果未能解决你的问题,请参考以下文章

JS 页面加载触发事件 document.ready和onload的区别

js中 onreadystatechange 和 onload的区别

js中 onreadystatechange 和 onload的区别

onreadystatechange和onload区别分析

JS 页面加载触发事件 document.ready和onload的区别

JS 页面加载触发事件 document.ready和onload的区别