以下这段代码:
protected System.Web.UI.WebControls.Button btnCreate;
protected System.Web.UI.WebControls.Table tb;
protected static int i = 0;private void btnCreate_Click(object sender, System.EventArgs e)
{
i = i + 1;
TableRow r = new TableRow ();
TableCell c1 = new TableCell ();
TableCell c2 = new TableCell ();
TableCell c3 = new TableCell ();
TextBox t1 = new TextBox();
TextBox t2 = new TextBox();
DropDownList l = new DropDownList ();

t1.ID = "tbx1"+ i;
t2.ID = "tbx2"+ i;
l.ID = "ddl"+ i; c1.Controls.Add (t1);
c2.Controls.Add (t2);
c3.Controls.Add (l);
r.Cells.Add (c3);
r.Cells.Add (c1);
r.Cells.Add (c2);
tb.Rows.Add (r);
}
本意是想按下btnCreate按钮后,就在页面的table控件内创建一个下拉框和两个文本框,运行后,第一次按下按钮,是创建出了这三个控件,但是再按下就没有用了~~~~~可能是什么原因啊?:(

解决方案 »

  1.   

    这是正常的现象,动态创建的控件,postback之后就没有了~
      

  2.   

    下面的例子是关于动态添加控件的,主要是给出一个思路,不但可以保持控件,还包括里面的值
    <%@ Page language="c#" Codebehind="动态添加控件(一).aspx.cs" AutoEventWireup="false" Inherits="bsTest2005_8_16.Samples.动态添加控件_一_" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    <HEAD>
    <title>动态添加控件(一)</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name="vs_defaultClientScript" content="JavaScript">
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post" runat="server">
    <FONT face="宋体">
    <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 536px; POSITION: absolute; TOP: 312px" runat="server"
    Text="增加一个TextBox"></asp:Button>
    <asp:Button id="Button2" style="Z-INDEX: 102; LEFT: 512px; POSITION: absolute; TOP: 344px" runat="server"
    Text="提取第一个TextBox的值"></asp:Button>
    <asp:TextBox id="txt" style="Z-INDEX: 103; LEFT: 528px; POSITION: absolute; TOP: 376px" runat="server"></asp:TextBox></FONT>
    </form>
    </body>
    </HTML>
    ****************************************
    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 bsTest2005_8_16.Samples
    {
    /// <summary>
    /// 动态添加控件_一_ 的摘要说明。
    /// </summary>
    public class 动态添加控件_一_ : System.Web.UI.Page
    {
            protected System.Web.UI.WebControls.Button Button2;
            protected System.Web.UI.WebControls.TextBox txt;
            protected System.Web.UI.WebControls.Button Button1;
            private ArrayList TextBoxsList
            {
                get
                {
                    if(ViewState["myTextBoxsList"]==null)
                        return new ArrayList();
                    else
                        return ViewState["myTextBoxsList"] as ArrayList;
                }
                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 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("TextBox1")).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
    }
    }
      

  3.   

    每次按下的时候,都要重新加载页面(postback),所以控件就没有,但是又执行了按钮事件,所以控件还是那几个……看起来就像再按下去没有用了一样……==================每次点按钮生成新控件的话,可以用SESSION记录一下状态。比如:每点一下按钮SESSION就加1,然后就循环生成几次……这样就好了