Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Page.IsPostBack = False Then
            Dim ltl As Literal = New Literal
            ltl.Text = "aaa"
            panel1.Controls.Add(ltl)
        End If
    End Sub如上在page.ispostback=false 的时候可以显示"aaa",但是在回发的时候这个ltl控件就没有了,怎样能保证ltl能保证视图.

解决方案 »

  1.   

    把Page.IsPostBack这段不要,如下:
    -----
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      Dim ltl As Literal = New Literal
      ltl.Text = "aaa"
      panel1.Controls.Add(ltl)
      End Sub
      

  2.   

    一种方法你用ajax
    还有种方法,你预先储存control2的信息,然后象2楼那样
      

  3.   

    这个问题回答过n遍了
    在OnInit中加载,只要加载方式在提交期间保持不变,控件的视图是自动保存的,
    这是由asp.net页面加载顺序决定的.参考以下链接,注意贴中我的回复http://topic.csdn.net/u/20100402/09/5cf8b5ca-768f-425d-8513-342a683c3129.htmlhttp://topic.csdn.net/u/20100411/20/c71dcdc2-db31-4fb0-86f7-9a3895cfaa01.html做过.net2003这些早期版本开发的对这个概念比较清楚,那时的OnInit事件是直接写好的
      

  4.   

    我觉得不用动态加那个控件了,直接放个控件进去,然后在那个地方写如果
    If Page.IsPostBack = True Then
    那个控件的Visible=false
    http://www.mystruggle.com.cn
      

  5.   

    放 在Page_Init也是一样,只要是在Page.IsPostBack = False 加载 的,在回发的时候就消失 了  Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
            If Page.IsPostBack = False Then
                Dim ltl As Literal = New Literal
                ltl.Text = "aaa"            panel1.Controls.Add(ltl)
                ltl.EnableViewState = True
            End If
        End Sub
      

  6.   

    把这句If Page.IsPostBack = False去掉,
    1、每次都要加载,不能说只有第一次才加载;
    2、如果每次在OnInit中加载的方式是一样的,那么控件的viewstate内容是"持久"的
      

  7.   

    动态加载的控件回发后不会自动重建,所以回发后页面上就看不到了。没有简单的现成功能可以实现这种自动重建,可以用一些第三方的控件或者自己写个辅助的工具
    http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx即使用了这样的“自动”功能,能简化的只是回发后的重建控件的代码,并不会带来性能上的提升,所以对性能有要求的话,应该针对你的实际情况来写重建控件的代码,简单的情况下就是去掉IsPostBack判断就好了。
      

  8.   


    不要想当然,自己试一下就知道了,
    微软一直就是这样干的,你看看.net2003生成的页面代码就知道了,
    这还要说多少遍
      

  9.   

    5楼已经详细回复了,再贴个vs2003微软的源代码片段:#region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    

    }
    #endregion
    只要花几个小时的时间就可以自己写个小例子把page的加载过程弄得清清楚楚,
    还有就是很多人认为Page_Load在OnLoad之前执行,其实是错误的,
    多了真的不想说了,说过n遍了,
    如果你有不同见解别在这里纠结了,另开贴讨论
      

  10.   

    嗯,没理解错的话,你说的是动态控件的“视图状态”是自动保存和恢复的,而我说的是“动态控件本身”并不会自动重建,看上去我也没有说错,不是吗?就楼主的问题来说,如果楼主的代码举的是实际的例子,那并不需要在OnInit中加载,在Page_Load中加载就可以了,只需要去掉IsPostBack判断就可以。我觉得我们的讨论还是和楼主的问题相关的,有助于帮助楼主澄清正确的答案,如果楼主觉得这个争论没有意义,在此先说声抱歉,打扰了。
      

  11.   

    #2楼那样去掉If Page.IsPostBack就可以了。这里有几个基本观点很值得重提:1. 例如我们需要用一个状态属性来标记当前页面上是否真的显示了这个Literal,于是我们不能在Page_Load之前加载它,因为那个时候状态ViewState还根本没有准备好,无法给我们提供动态判断功能。而如果我们不用动态判断页面状态来觉得动态行为,我们又何必动态加载控件呢?直接写到设计页面上让它傻瓜式地自动加载而不用编写一行代码岂不更好。这就引出第二个问题。2. 是不是像#4楼所说的在设计页面上预先写好的控件“效率比较高”。这里可以肯定地说,aspx或者ascx编译出来的那些由用户在设计页面上预先写好控件也是在Page创建时被创建、加载到控件树上去的,只不过它发生在Init之前。而我们在Page_Load中编写的动态加载代码,只是因为我们要更多的控制,例如判断ViewState来避免多余地去加载,但是也都是需要加载的。说那些预先写死在设计(html格式)代码上的控件没有在服务器每一次处理请求而创建Page时创建出来,难道是从天上掉下来的控件然后正好射入了刚刚产生的Page生命期中了吗?
      

  12.   

    基本上页面生命期中这几个相关的动作是这样的:首先在页面对象初始化时,初始化最初的控件树,既预先在设计代码中的那些控件;然后进入Init阶段,这个阶段遍历控件树进行整理并回填部分分析信息,形成内部的一些统计结构用于随后的快速操作,例如这时候就收集了ID编号集合等等;第三部分就是装载ViewState,然后判断上一次输出html时的那些控件是否已经按照原来的顺序加载到控件树上,如果是则逐一填入每一个控件的ViewState,填入控件的ViewState之后再处理客户端提交新值,并且准备随后触发各个控件的有关 xxxxChanged 类型的事件,在这个遍历过程中如果控件恰好是客户端最终触发回发的事件也被记录下来一边随后触发此类事件;接下来是递归调用所有控件的Load事件;然后就是触发所有 xxxxChanged 类事件;然后就是触发客户端回发事件.....关键地,asp.net为在Page_Load中动态加载控件专门设计了“追赶”机制。请仔细看msdn上页面声明周期中关于“添加的控件的追赶事件”的描述。于是我们不需要在Page初始化时加载控件,而在Page_Load中加载控件,也能将控件正确加入控件树、在控件上整理和回填统计信息、然后正确回填ViewState和PostData、然后正确地记录好将要在Load之后触发哪些控件。至此,动态添加的控件就追赶上了那些在Page初始化时添加的控件了!
      

  13.   

    在页面LoadComplete之前任何阶段都可以动态加载控件,但是如果你选择根本不存在ViewState的阶段来加载控件,也就是不能首先获取ViewState然后再更具这个值来动态加载控件,那么就跟在设计代码html中写死控件没有什么两样了,费力不讨好,没有必要。因此几乎可以说,如果不在page_load中动态加载控件,就不要动态加载控件了。除非你只是为了展示控件除了在设计时的html中书写以外,原来也可以写代码来加载。
      

  14.   

    一个所谓动态加载机制往往是用在这种场合:例如用户在一堆选项按钮上选择或者在Text上录入了之后,按提交按钮,然后这个Button_Click事件中就根据这一堆控件综合判断出该呈现哪一类表单(例如查询报告),然后就加载了这个表单控件的实例到控件树,(最关键地是)同时把这个表单类型写入ViewState。这样页面就第一次输出了用户选择的表单。但是当用户在表单上操作,从而提交请求到服务器时,服务器当然需要在Page_Load中根据表单类型再次重新创建和加载表单实例,这样表单中的各种子控件也就追赶地自动恢复了一切状态。如果我们们不知道到底有多少种动态表单,当然无法在页面设计html中写死表单类型,只能在Page_Load阶段根据一个记录了“当前正在显示的表单”状态的ViewState来加载类型可变的表单。
      

  15.   

    1、楼主就是要动态加载的控件保持视图,在OnInit加载就能持久视图(在这里其他控件已经创建,可以引用,并且正好在loadview之前);
    2、写在页面的控件也是一遍遍加载的,这个你在PreInit就可以发现:form里面啥也没有;
    3、由于Page_Load的"追赶"是由OnInit触发的,所以还可以利用base.OnInit(e)的置前和置后来调整Page_Load与OnInit之间的执行先后;
    4、看吴伟同志长篇大论说得那么好,我又忍不住来补充了2句,只是有点不同,设计时刻不存在的控件只有动态加载,这个说来话又长了,呵呵;
    5、jshi123:如果您能听取我之前的建议,就当是休息,凭你那颗星,不超过1个小时做个例子,那以上那么多纯属多余
      

  16.   

    可是我理解楼主的本意并非要维持动态控件的视图状态,而只是希望省略掉回发后的动态加载过程,并且认为这样做可以提高性能,虽然楼主的问题中确实包含“视图”这个词。我认为只有准确地理解问题,才有可能帮助提问者厘清一些概念,甚至避免一些混淆的信息。后面的话不是很看得懂,我就是在休息的时候才到csdn来和大家交流一下的,任何有助于帮助到提问者或是我的建议都是欢迎的,绝不多余。