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

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

  原来,在页面刷新,上次动态生成的控件就没了,郁闷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(); 提取它的值。

posted @ 2011-07-14 18:19  俗雅冰山  阅读(2338)  评论(0编辑  收藏  举报