我通过点击menu的菜单项来动态向PlaceHolder中加载.ascx,但我在运行页面地时候,我点击.ascx中的按钮时页面回传,PlaceHolder控件被清空(.ascx不见了)。现在只有在page_load中添加:
        if (phModule.Controls.Count == 0 && this.ModulePath != "")
        {
            Control ctl = Page.LoadControl(this.ModulePath);
            this.phModule.Controls.Add(ctl);
        }
让页面重新加载.ascx才能看到。
我想问的是:为什么Label的Text能保存状态,PlaceHolder控件中的子控件为什么不能保存状态呢?如果能,那我该怎么做呢?

解决方案 »

  1.   

    你是不是在.ascx.cs文件中加了if(!IsPostBack)了?把它去掉
      

  2.   

    .ascx.cs文件没有if(!IsPostBack)。
        protected void Page_Load(object sender, EventArgs e)
        {
            this.UserID = "zenglu";
        }
        protected void Page_Init(object sender, EventArgs e)
        {
            this.spSelectPicture.ConfigPath = "LogoDefaultDir";
            this.Address1.TownVisible = true;
            this.ViewList1.QueryID = 2;
            spSelectPicture.Colsed += new SelectPictureEventHandler(spSelectPicture_Colsed);
            spSelectPicture.SelectedPicture += new SelectPictureEventHandler(spSelectPicture_SelectedPicture);
            spSelectPicture.UploadedPicture += new SelectPictureEventHandler(spSelectPicture_UploadedPicture);
            this.ViewList1.CommonDelete += new CommonViewEventHandler(ViewList1_CommonDelete);
            this.ViewList1.CommonEdit += new CommonViewEventHandler(ViewList1_CommonEdit);
            this.ViewList1.CommonView += new CommonViewEventHandler(ViewList1_CommonView);    }
      

  3.   

    Label的Text能保存状态是因为页面初始化的时候label已经存在,只是把text的状态返回回去,而你动态加载的控件再初始化的时候是不存在的,是你运行到代码部分的时候才加上去的。
      

  4.   

    我现在做的系统的页面中只有几个aspx的,数据处理模块都是用ascx的,它们都是动态添加到aspx上去的,现在的问题是每次postback都要重新加载一次ascx,并且ascx中的控件也要重新从数据库中绑定值,我觉得这样增加了web服务器和数据库服务器的负担。有什么好一点的方法没?
      

  5.   

    哎,十分不喜欢用这些东西,postback来,postback去的。
    不讨论了,支持楼主一下。
      

  6.   

    Label的Text能保存状态是因为页面初始化的时候label已经存在,只是把text的状态返回回去,而你动态加载的控件再初始化的时候是不存在的,是你运行到代码部分的时候才加上去的。
    而且的确不保存动态加载的控件.
      

  7.   

    谢谢,各位热心的兄!
    刚才chokobo(),jackwofe() 都说:
    Label的Text能保存状态是因为页面初始化的时候label已经存在,只是把text的状态返回回去,而你动态加载的控件再初始化的时候是不存在的,是你运行到代码部分的时候才加上去的。
    而且的确不保存动态加载的控件.有什么方法把这个动态加载的控件让它在初始化之前就存在呢?
    比如说,先随便往PlaceHolder里面放一个ascx,指定ID="ASCX1",然后动态加载的时候清空PlaceHolder,再加载新的ascx同样指定ID="ASCX1"。
      

  8.   

    ascx.cs文件没有if(!IsPostBack)。那就加这一句代码了.试试看.
      

  9.   

    HTTP是无状态的协议。所以无论服务器端技术如何,始终无法改变这个本质。
    要想保持网页状态,必须把状态回传的给服务器。
    将PlaceHolder控件的EnableViewState属性设为true,再试。
    参考MSDN的控件状态与视图状态来解决问题。