把你的添加控件的代码写到page OnInit方法或者page_onload方法中(放在if(!Page.IsPostBack)外就行了),因为页面每一次PostBack就结束了一次生命周期,所以用代码添加的控件必须要重新初始化一次。
//增加一个linkbutton到page中
private void addCon()
{
 kbAdd=new LinkButton();
 lkbAdd.ID="lkbAdd";
 lkbAdd.Text="<IMG height='13' src='../images/jia.gif' width='13' border='0' align='middle' alt='增加一行'>";
 lkbAdd.Command+=new System.Web.UI.WebControls.CommandEventHandler(this.lkbAdd_Click);
 if(this.DataGrid1.Items[this.DataGrid1.Items.Count-1].Cells[2].FindControl("lkbAdd")==null)
 { 
 this.DataGrid1.Items[this.DataGrid1.Items.Count-1].Cells[2].Controls.AddAt(0,lkbAdd);
 }
}override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
addCon();
}

解决方案 »

  1.   

    你如果是触发某个事件后在生成一个动态控件,就必须用the control的ParentControl执行寻找该控件是否已经存在page中
    这就是下面代码
    if(this.DataGrid1.Items[this.DataGrid1.Items.Count-1].Cells[2].FindControl("lkbAdd")==null)
     { 
     this.DataGrid1.Items[this.DataGrid1.Items.Count-1].Cells[2].Controls.AddAt(0,lkbAdd);
     }
    的意义。
      

  2.   

    但是,我每次添加的控件名称都相同啊,我添加的控件可能在post N次后 又添加新的控件,也就是说控件添加时间不确定,控件类型数量不确定。
      

  3.   

    请问,你添加这些控件是webcontrols还是其他html标签?
    另外说一句,你说的想把代码添加的控件在页面上永久显示,这些必须通过编程才能
    实现。
    用代码动态生成的控件和你在页面放一个控件在asp.net运行原理上来讲,是截然不同
    的概念。
    代码动态生成的控件和动态加栽对象是相近的概念,其实都是后期绑定的范畴,如果你不是很理解,你可以参考.net msdn反射机制的介绍。
    而你在页面放一个控件,就形成了这样一个事实,这个控件就成了这个页面类的一个成员。在在页面类实例化之后,这个控件也随之实例化了。
      

  4.   

    这就是说 对于页面类来说,对于实际放在页面上控件,我们可以看成是一个类变量,而动态加载的控件其实就有点像局部变量了。
    你现在想把一个局部变量作为类变量来用,你每次调用就要对这个局部变量进行赋值运算。
    如此,你可以想到,你要的这个功能(每次添加的控件名称都相同啊,我添加的控件可能在post N次后 又添加新的控件)是可以实现的。但是,每次添加一个控件进去,你就要写更到
    的代码来对这些所谓的局部变量进行赋值运算和判断。
    ....
    你能明白我的意思吗?