这个问题很多论坛问过很多遍了,可是目前好像没找到好的回答,很多人可能不是很理解才没有回答吧.这里我把问题详细说一下. 
动态添加问题就是在页面后台代码中新建控件实例. 
比如在Page_Load()中 
TextBox TB=new TextBox(); 
Page.Controls.Add(TB); 
但这样会返回TextBox控件必须在有runat = server 的标记窗体内的提示.对于这个问题,一直没有很好的回答,这里再次提出这个问题,但愿不要被淹掉. TextBox等控件不可以,但是如果是Label控件就可以了.因为TextBox可能是服务器控件吧. 
动态添加控件意义很重大,希望有高手能解决.谢了. 
另,最好是在空页面里动态添加控件,如果事先你在页面上放了其他控件,然后再在这个控件上动态添加控件的话,这个方法已经知道了. 

解决方案 »

  1.   

    最好在页面上加一个Panel,把Panel放在form中,然后用Panel.Controls.Add(),就没问题了
      

  2.   

    恩,我知道先在页面上放控件,然后再在那个控件的基础上添加动态控件的方法.页面什么控件都没有如何做?现在最想了解的就是这个......,变相的问,如何将"runat=server"属性添加到控件中去?我用过
    Control.Attributes.Add("runat","server");的办法,貌似不管用啊.
      

  3.   

    TextBox TB=new TextBox(); 
    Page.Controls.Add(TB); 
    ---------------------------
    这种添加方式,添加不到<form></form>中间去,而ASP.NET又要求,服务端控件必须放在<form></form>中间,于是就出现楼主所说的问题了.
    解决问题的办法其实也简单,如下写法即可:TextBox TB=new TextBox(); 
    Page.Controls[1].Controls.Add(TB); 
      

  4.   

    或者也可以先找到已经存在页面上的某个控件,比如原来已经有一个TextBox控件,那么就可以这样:
    this.TextBox1.Parent.Controls.Add(TB);
      

  5.   

    楼上说的切中要害,HOLD ON,我试试!
      

  6.   

    OK!谢谢hchxxzx(NET?摸到一点门槛)的帮助
    但是那个
    Page.Controls[1].Controls.Add
    中的1代表什么,页面中不是没有控件吗?
      

  7.   

    也可以拖一个PlaceHolder控件,把动态添加的控件加到PlaceHolder中
      

  8.   

    先拖控件到页面的办法有很多,PANEL,PLACEHOLDER,TABLE等都可以,这些都是一个道理
      

  9.   

    dim c as control
    for each c in Page.controls
      if typeof c is htmlform then exit for
    next c
    if c is nothing then 
      throw new("页面上没有form。")
    else
      c.controls.add(TB)
    end if
      

  10.   

    但是那个Page.Controls[1].Controls.Add 中的1代表什么,页面中不是没有控件吗?
    --------------------------------------------------------------------------
    这里假设Form总是装在Page.controls中的第二个位置。Page.controls中有好多控件的。你可以在“空页面”的page的load方法上设一个端点,然后用“监视”窗口输出页面的controls看看!
      

  11.   

    Page.Controls[1].Controls.Add 中的1代表什么我也覺得很納悶,我曾經也遇到過樓主類似的問題,不明白為甚麼要用1