page_init与page_load有什么区别

首先,我们要弄明白,Page是一个Class,这个明白吧?
然后,Page有两个事件,一个是Load事件,另外一个是Init事件。
然后,在那个构造方法里面,比如一般是 WebForm1()
里面调了一个方法InitComponent(),在这个方法里面,为Page类的两个事件定义了两个处理方法,即
this.Load+=.....Page_Load....//注意,这个Page_Load你可以改用你任何喜欢的名字:)
然后,你就可以在Page_Load里面写任何你喜欢写的代码了。
如果是WinForm的话,那上面的Page应该换为System. Windows.Forms.Form这个类了。   
  事件的触发次序是page_init在先,page_load在后

他们都是不可或缺的,所以如果你重载这两个方法,不要忘记调用父类的同名方法,不然会出现很大问题。   
    
  在页面的init方法中,会“逐一调用所有子控件”,执行这样四项主要任务:   
  1.   从页面上的ViewState隐藏字段取回上一页面的状态值。   
  2.   取得用户新修改过的值(Post值)。如果发觉修改,还会记录下来准备触发changed事件。   
  3.   取得event事件,例如各个控件的click事件或者用户定义的事件,也是记录下来。   
  4.   调用TrackViewState方法,通知控件此时之后对ViewState的修改都需要输出保存到页面上。   
    
  在页面的load方法中,会“逐一调用所有子控件”的load事件。一般来说用户自定义的对控件属性的修改操作在此时完成。   
    
  但是,如果在page的load方法中动态地向控件的Controls集合添加新的子控件,此时仍然会对被添加的子控件执行上述所有操作。因此如果你 创建一个子控件,然后设置一个viewstate值,然后才把它放入page控件树中,会发现这个viewstate值没有保存住,又被原来的值“回填” 回来了。   
    
  在页面的load方法之后,才会触发各个控件的changed事件,之后是各种click和自定义事件。

控件自己从viewstate字段取回值的时候,是根据clientID作为唯一标识符的。此值是根据上层控件(如果未实现INamingContainer接口则继续查找上层控件)的clientID加上自己的ID组合而成。   
    
  因此,对于动态增加的控件,如果没有准确地重建ClientID,就不要指望Viewstate中的值正确。同理,那些changed事件、click事件和其它自定义事件也没办法准确触发。

为什么“一般来说用户自定义的对控件属性的修改操作在此时完成”呢?   
    
  因为只有这个时候各个控件的值才准备好。如果你的界面需要根据客户端录入的值,或者任何当前正确的页面属性值来生成(而不是简单得在一片空白的时候就能生成),只能在这个时刻之后才恰当。

你可能感兴趣的:(winform,webform,class,任务,.NET)