如果页面没有回传,发生顺序为:!page.isPostBack
OnInit Page_Load CreateChildControls OnPreRender RenderContents如果页面没有回传,发生顺序为:page.isPostBack
OnInit  CreateChildControls  Page_Load  Button1_Click  OnPreRender RenderContents
为什么会有Page_Load CreateChildControlsCreateChildControls  Page_Load的不同?  

解决方案 »

  1.   

    在回发的时候,在Init之后,在page_Load之前(实际上更是在LoadPostData之前),在进行LoadViewState的时候,对于ViewState中每一个控件的状态,asp.net都会调用页面的FindControl来查找出这个控件好设置ViewState。我们来看看控件(Page也是一个控件)的FindControl源代码:protected virtual Control FindControl(string id, int pathOffset)
    {
        string str;
        this.EnsureChildControls();
        if (!this.flags[0x80])
        {
            Control namingContainer = this.NamingContainer;
            if (namingContainer != null)
            {
                return namingContainer.FindControl(id, pathOffset);
            }
            return null;
        }
        if (this.HasControls() && (this._occasionalFields.NamedControls == null))
        {
            this.EnsureNamedControlsTable();
        }
        if ((this._occasionalFields == null) || (this._occasionalFields.NamedControls == null))
        {
            return null;
        }
        char[] anyOf = new char[] { '$', ':' };
        int num = id.IndexOfAny(anyOf, pathOffset);
        if (num == -1)
        {
            str = id.Substring(pathOffset);
            return (this._occasionalFields.NamedControls[str] as Control);
        }
        str = id.Substring(pathOffset, num - pathOffset);
        Control control2 = this._occasionalFields.NamedControls[str] as Control;
        if (control2 == null)
        {
            return null;
        }
        return control2.FindControl(id, num + 1);
    }
    一开始就调用EnsureChildControl(从而就调用了CreateChildControls)来创建了子控件,这样就通知子程序赶紧创建一个“空架子”,好让asp.net可以找到这个空架子、填入状态值。不是所有子控件都是在回发时在页面的page_load之前恢复出子控件架构的。例如你在父控件的page_load事件处理程序过程中动态加载一个控件,这时候这个加入的控件就会“追赶上”页面的各个过程——Init、LoadViewState、LoadPostData等等,因此在父控件的page_Load中动态加载的控件它自己以及它的子控件的CreateChildControls就是在父控件的page_Load都触发了的时候才被调用的。
      

  2.   

    进一步地补充(在上面的一句之前),当回发的时候,许多开发者都被教会在page_load中去处理控件的状态以及直接从控件读取新的值,因此asp.net必须实现为在page_load之前就填好了控件状态以及客户端提交的值。
      

  3.   

    sp1234  既然“许多开发者都被教会在page_load中去处理控件的状态以及直接从控件读取新的值”那么为什么页面没有被提交的时候,是先有Page_Load,再去创建复合控件的子控件呢?
      

  4.   


    因为此时根本不用在page_load之前进行LoadViewState和LoadPostdata,从而也根本不会在page_Load之前去调用FindControl,从而根本不会再page_load之前调用EnsureChildControls,也就根本不会在page_load之前调用CreateChildControls。