原来,在页面刷新,上次动态生成的控件就没了,郁闷ing.......,要想动态的控件在每次PostBack后都能够显示在页面上,则每次PostBack都需要重新加载。每次加载就能够显示,Easy!!!
但是新问题又来了,如果取值呢?FindControl可以找到控件,但是页面刷后不是又重新生成了控件吗,原来控件上的值还有吗,我想肯定没有了吧(我想的),那怎么取值,我又郁闷了!事实说明我所想的是错的,PostBack后,重新生成的控件,不但能够使控件重新显示出来,并且值仍然能够取到,当然前提是PostBack后生成的控件的ID和上次生成的要一致。至于为什么,原理方面的东西没搞太明白,正在研究,希望有高手朋友路过时,随便指点一下。
一个小例子:
HTML页面代码:
<form id="Form1" method="post" runat="server">
<asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 64px; POSITION: absolute; TOP: 184px" runat="server"
Text="增加一个TextBox"></asp:Button>
<asp:Button id="Button2" style="Z-INDEX: 102; LEFT: 248px; POSITION: absolute; TOP: 184px" runat="server"
Text="提取第一个TextBox的值 ==>" Width="200px"></asp:Button>
<asp:TextBox id="txt" style="Z-INDEX: 103; LEFT: 472px; POSITION: absolute; TOP: 184px" runat="server"
ReadOnly="True"></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(); 提取它的值。