控件生命周期
初始化:Init 事件(OnInit 方法)
加载视图状态:LoadViewState
处理回发数据:LoadPostData 方法 (如果已实现 IPostBackDataHandler)
加载:Load 事件 (OnLoad 方法)
发送回发更改通知:RaisePostDataChangedEvent 方法(如果已实现 IPostBackDataHandler)
处理回发事件:RaisePostBackEvent 方法 (如果已实现 IPostBackEventHandler)
预呈现:PreRender 事件 (OnPreRender 方法)
保存状态:SaveViewState 方法
呈现:Render 方法
处置:Dispose 方法
卸载:UnLoad 事件(On UnLoad 方法)比如你在Page_Load里面创建控件,这时候控件的Page已经对本身的所有子控件调用了LoadViewState方法,而你这个创建的控件还没有创建出来,就没有调用LoadViewState了,当然他的ViewState就没有了,这时候你可以在控件创建好后调用一下LoadViewState有可能就可以了,不过我没有试过,一般动态创建的控件是把EnableViewState设置成False的。

解决方案 »

  1.   

    我的用戶控件里面有一个文本框和一个DataGrid:
    protected override void CreateChildControls()
    {
    base.CreateChildControls ();
    BuildModuleList(PlaceHolder1,ModName);
    }
      

  2.   

    重写CreateChildControls,每次都载入用户控件,用户控件中还有一个按钮:
    protected override void CreateChildControls()
    {
    base.CreateChildControls ();
    BuildModuleList(PlaceHolder1,ModName);
    }
    private void BuildModuleList(Control parent, String Modules) 
    {
    parent.Controls.Clear();
    if (Modules == null)
    return;
    String [] ModuleList = Modules.Split(new char[] {';'});
    for (int i=0;i<ModuleList.Length;i++) 
      {
       String moduleSource = ModuleList[i];
       if ((moduleSource != null)&&(moduleSource != "")&&(moduleSource != "System.DBNull")) 
    {
    moduleSource=Request.ApplicationPath+moduleSource;
    if (File.Exists(Server.MapPath(moduleSource)))
    {
               Control UIModule = Page.LoadControl(moduleSource);
    parent.Controls.Add(UIModule);
    UIModule.ID = "UIModule"+i.ToString();
    UIModule.EnableViewState = true;
    parent.Controls.Add(new LiteralControl("<br>"));
    }
    else
    {
    parent.Controls.Add(new LiteralControl("<Font color='Sliver'> 加载组件出错</font>"));
    }
        }
       }
    }
    点击按钮后,TextBox里面输入数据还在,而DataGrid中以前绑顶的数据不翼而飞了~~~