把你的添加控件的代码写到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();
}
//增加一个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();
}
这就是下面代码
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);
}
的意义。
另外说一句,你说的想把代码添加的控件在页面上永久显示,这些必须通过编程才能
实现。
用代码动态生成的控件和你在页面放一个控件在asp.net运行原理上来讲,是截然不同
的概念。
代码动态生成的控件和动态加栽对象是相近的概念,其实都是后期绑定的范畴,如果你不是很理解,你可以参考.net msdn反射机制的介绍。
而你在页面放一个控件,就形成了这样一个事实,这个控件就成了这个页面类的一个成员。在在页面类实例化之后,这个控件也随之实例化了。
你现在想把一个局部变量作为类变量来用,你每次调用就要对这个局部变量进行赋值运算。
如此,你可以想到,你要的这个功能(每次添加的控件名称都相同啊,我添加的控件可能在post N次后 又添加新的控件)是可以实现的。但是,每次添加一个控件进去,你就要写更到
的代码来对这些所谓的局部变量进行赋值运算和判断。
....
你能明白我的意思吗?