page_load
{
   DropDownList ddlDynamic = new DropDownList();
   ddlDynamic.ID = "ddlDynamic";   form1.Controls.Add(ddlDynamic);   if (!IsPostBack)
   { }
   if (IsPostBack)
   { }}
为什么PostBack的时候,form1.Controls没有继续添加新的ddlDynamic。
这跟页面的控件树以及viewstate有关,清楚的麻烦讲下原因好吗?谢谢

解决方案 »

  1.   

    为什么PostBack的时候,form1.Controls没有继续添加新的ddlDynamic。=========1。
    每次都会执行那段添加代码2。
    每次请求页面,不管是get方式还是post,asp.net 页面都是重新实例化一遍,你说它会是
    “继续添加新的ddlDynamic”吗?
    3。
    在这点上跟 ViewState 没有关系4。
    当然跟 asp.net 页生存周期有关系了,具体请参考 MSDN,没有办法一两句说清楚~另推荐一篇对 asp.net 页生命周期以及控件周期 以及 ViewState 较深入剖析的文章
    Scott Mitchell
    创建动态数据输入用户界面
    http://www.microsoft.com/china/msdn/library/webservices/asp.net/dnasppDynamicUI.mspx?mfr=true
    同时 LZ 要记住一点 一个 Page 也是一个 Control,特殊的 Control
      

  2.   

    动态添加的控件每次都要添加一次,因为postback后添加的并不是新的,而是第一次那个.
      

  3.   

    还是不大清楚,可能是我的理解有误。我是这样理解的每次postback之后,loadviewstate的时候,不是会根据viewstate重建控件树吗,此时已经存在了上一次的那个ddlDynamic控件了。这样如果继续page_load里的代码。不是会在添加一个?这里不考虑重名的因素,我想父控件(form)是实现了INameContainer接口的吧。
      

  4.   

    再有,if (!IsPostBack)
       {里面是 ddlDynamic的数据项}这样的话,postback之后,如果是新的控件,那就没有数据了。所以应该不是添加新的控件。
      

  5.   


    动态添加的控件每次都要添加一次,因为postback后添加的并不是新的,而是第一次那个.
      

  6.   

    哦。我想大概明白了!
    子控件里的id必须唯一,这样相当于这段代码
    DropDownList ddlDynamic = new DropDownList();
       ddlDynamic.ID = "ddlDynamic";   form1.Controls.Add(ddlDynamic);
    虽然执行,但是废的,因为重复不能添加。如果有添加的话,postback后就没有绑定数据项了。
    if (!IsPostBack)
       {里面是 ddlDynamic的数据项}也肯定跟viewstate有关,毕竟要用上一个页面的控件树来恢复本次页面。以上是关于我的理解。请各位看看有没有错误,晚上给分!谢谢!
      

  7.   

    动态添加的控件每次都要添加一次,因为postback后添加的并不是新的,而是第一次那个.疑问
    页面控件的实例化,不是通过控件树来恢复???
      

  8.   

    谢谢各位,我的理解是错的cpp2017(慕白兄) wo594261() Jinglecat(晓风残月 >感谢!