使用Asp.net动态生成控件的使用总结

这几天有个需求是要求动态生成控件。由于对Asp.net不熟,开始时把我弄晕了,始终是第一次加载的控件,PostBack后就不存在了。

  原来,在页面刷新,上次动态生成的控件就没了,郁闷ing.......,要想动态的控件在每次PostBack后都能够显示在页面上,则每次PostBack都需要重新加载。每次加载就能够显示,Easy!!!

  但是新问题又来了,如果取值呢?FindControl可以找到控件,但是页面刷后不是又重新生成了控件吗,原来控件上的值还有吗,我想肯定没有了吧(我想的),那怎么取值,我又郁闷了!事实说明我所想的是错的,PostBack后,重新生成的控件,不但能够使控件重新显示出来,并且值仍然能够取到,当然前提是PostBack后生成的控件的ID和上次生成的要一致。至于为什么,原理方面的东西没搞太明白,正在研究,希望有高手朋友路过时,随便指点一下。

  一个小例子:

HTML页面代码:

<form ></asp:TextBox>

</form>

CS代码:

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

namespace UserRemindWindow.WebUI

{

/// <summary>

/// 动态添加控件_一_ 的摘要说明。

/// </summary>

public class 动态添加控件_一_ : System.Web.UI.Page

{

protected System.Web.UI.WebControls.Button Button1;

protected System.Web.UI.WebControls.Button Button2;

protected System.Web.UI.WebControls.TextBox txt;

private ArrayList TextBoxsList

{

get

{

if(ViewState["myTextBoxsList"]==null)

return new ArrayList();

else

return (ArrayList)ViewState["myTextBoxsList"];

}

set

{

ViewState["myTextBoxsList"] = value;

}

}

private void Page_Load(object sender, System.EventArgs e)

{

// 在此处放置用户代码以初始化页面

if(Page.IsPostBack)

{

for(int i=0;i<this.TextBoxsList.Count;i++)

{

string txtID = this.TextBoxsList[i].ToString();

TextBox tmp = new TextBox();

tmp.ID = txtID;

Page.Controls[1].Controls.Add(tmp);

tmp.Text = Request.Form[txtID].ToString();

}

}

}

// private TextBox[][] MyTextBoxs = new TextBox[][]{new TextBox[]{},new TextBox[]{},new TextBox[]{}};

private void Button1_Click(object sender, System.EventArgs e)

{

TextBox tmp = new TextBox();

tmp.ID = "TextBox" + this.TextBoxsList.Count.ToString();

Page.Controls[1].Controls.Add(tmp);

ArrayList array = this.TextBoxsList;

array.Add(tmp.ID);

this.TextBoxsList = array;

}

private void Button2_Click(object sender, System.EventArgs e)

{

this.txt.Text = ((TextBox)Page.FindControl("TextBox0")).Text;

}

#region Web 窗体设计器生成的代码

override protected void OnInit(EventArgs e)

{

//

// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。

//

InitializeComponent();

base.OnInit(e);

}

/// <summary>

/// 设计器支持所需的方法 - 不要使用代码编辑器修改

/// 此方法的内容。

/// </summary>

private void InitializeComponent()

{

this.Button1.Click += new System.EventHandler(this.Button1_Click);

this.Button2.Click += new System.EventHandler(this.Button2_Click);

this.Load += new System.EventHandler(this.Page_Load);

}

#endregion

}

}

这个代码是CSDN论坛的朋友提供的,我自己的太长,就用这个了。作用是动态生成TextBox,并且用

tmp.Text = Request.Form[txtID].ToString(); 提取它的值。