动态向页面加入一个下拉框:protected void Page_Load(object sender,EventArgs e)
{
        DropDownList ddl=new DropDownList ();
        if (!IsPostBack) //页面第一次加载时初始化值
        {
                    ddl.Items.Add("test1");
                    ddl.Items.Add("test2");
        }
        Form.Controls.Add(ddl);  //加入表单控件树
}
然后在页面上加入一个按钮,启动页面后点击按钮,发现下拉框中的选项都消失了。但是如果加入表单控件树的代码之前就不会发生这样的问题:
protected void Page_Load(object sender,EventArgs e)
{
        DropDownList ddl=new DropDownList ();
         Form.Controls.Add(ddl);  //加入表单控件树
        if (!IsPostBack) //页面第一次加载时初始化值
        {
                    ddl.Items.Add("test1");
                    ddl.Items.Add("test2");
        }
}
书上说,”这是因为一旦控件被加入了页面控件树,TrackViewState()方法就会自动调用来维护控件的视图状态(这样,控件的初始化数据就能保存下来),因此,只有把初始化控件的语句放到加入表单控件树的语句之后,下拉列表框中的数据才能保留。“可我奇怪,放在之前和之后有神马区别?回发时,Form.Controls.Add(ddl);  总是要执行的,而 if (!IsPostBack) 语句块总是不会执行的,但为嘛结果就有区别呢?

解决方案 »

  1.   

    每一次在动态创建一个服务器控件的时候在Form.Controls.Add(ddl)的时候会重新调用一次页面初始化事件,所以在动态创建的控件添加到Form里面的时候TrackViewState()并未开启
      

  2.   


    楼主的问题是
    Form.Controls.Add(ddl); //加入表单控件树
    这句话在一个条件判断的前后为什么有区别,而这个条件判断又明确是不会执行的,仅仅因为判断了一下就改变状态,这个副作用有点大,我也疑惑,等高人。
      

  3.   

    楼主的问题是
    Form.Controls.Add(ddl); //加入表单控件树
    这句话在一个条件判断的前后为什么有区别,而这个条件判断又明确是不会执行的,仅仅因为判断了一下就改变状态,这个副作用有点大,我也疑惑,等高人。
      

  4.   

    如果加在判断之前就会将后面改变的数据保存在Viewstate里面,在判断之后当然不会了,理由就是Form.Controls.Add()这个方法会重新初始化控件,第二次执行postbackdata
      

  5.   

    您这到底是CS的还是BS的,怎么又是IsPostBack,又是Form的?
      

  6.   

    放在后面压根就不会将数据保存到viewstate里面
      

  7.   

    LZ对IsPostBack或者说对编程理解不够啊
    你每次刷新页面就对ddl进行了重新实例!!
    而赋值的过程只在第一次的加载时生成的那个ddl实例进行了赋值!!
    每次刷新又重新生成了一个新的dll,而你却要求对它有值?
    不要去研究什么viewstate,什么页面状态
    这根本不是深层技术的疑问,是楼主编程思维的问题!!修改:
    直接将ddl的实例,赋值和添加到容器的过程放到!IsPostBack内
      

  8.   


    做过测试吗?放到!IsPostBack,怕是连下拉框都要在递交后消失了吧
    而且楼主的问题不是要如何解决,而是为什么一句话在一个条件判断为假的语句块前后执行会有区别。
      

  9.   

    楼主这样的疑问是不错,可以对ViewState保存数据的过程有所了解
    但是在实际的程序开发中,你这样的开发方式是不可取的
    说为何会有值的差异,可以用引用类型和内存存储的理念来解释
    当第一次实例出DDL,在内存中开辟空间将Item的值保存到内存中
    并指向这个DDL实例
    当刷新回发页面时,实例出第二个DDL并将Item的值指向到第一次
    实例出来的DDL地址,至于为什么指向第一次实例地址
    这就是ViewState保存页面数据的特点同样这些数据也是存放在内存中的
    产生差异,最重要的原因可能是IsPostback对页面初始化的控制,或许
    是对页面属性从ViewState中读取和清空的或者是内存指定的一些操作
      

  10.   

    我晕。下拉框的值当然会没有了。  点击按钮后又到page_load方法, 但不会运行!IsPostBack 里面的语句。只有在页面第一次加载时才进入!IsPostBack .
      

  11.   


    问题就是在这里呀,唯一的区别就是一个执行了IsPostback判断,一个没有,但是一个属性的读取怎么可能会对状态产生如此大的影响?这样的设计是不是有问题?IsPostback到底是如何实现的,现在疑惑的就是这些问题,继续等高人解答
      

  12.   

    自己找到答案了,谢谢大家的帮助,感谢金老师:http://blog.csdn.net/bitfan/article/details/2504743