功能如下:点添加按钮就自动在Panel Controls add一TextBox控件(N个TextBox,ID自动编号),点确定后要取到各个TextBox控件的text.
请教高手如何遍历Panel才能找到各个ID所应对的TextBox控件的值?
在此谢过!!!

解决方案 »

  1.   


    TextBox txtctl=Panel1.FindControl('ID') as TextBox;
    //如果你的ID命名比较有规律,例如TextBox1,TextBox2....,可以使用如下循环
    for (int i=0;i<textbox的总数;i++)
    {
        TextBox txtctl=Panel1.FindControl('TextBox'+i.ToStrint()) as TextBox;
        if (txtctl!=null)
        {
            //操作
        }
    }
      

  2.   

    还是不行呀
    为null值,这是为什么?Panel可以找的到!
      

  3.   

    TextBox txtctl=Panel1.FindControl('ID') as TextBox;先这样找到 然后在 遍历下就找到值了
      

  4.   

    问题是我一个也找不着,更别说遍历了。
    TextBox t1=(TextBox)FindControl("textbox1");
    TextBox t1=dn.FindContol("textbox1") as TextBox;这两种写法都找不着呀,为null而
    Panel p1=(Panel)FindControl("dn");
    p1就可以找的着。
      

  5.   

    我按你这个要求写了一个例子,动态加载的控件需要在PostBack的时候,重新加载一次,在重新加载的时候指定ID即可,而TextBox的值应该是在ViewState中找得到的。下面这个例子可以直接运行,你试试看,祝你好运。
    public partial class AddTextBoxSample : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ReLoadAddedTextBoxs();
        }    //重新加载已经加载过的TextBox
        private void ReLoadAddedTextBoxs()
        {
                for (int i = 1; i <= AddedTextBoxIds.Count; i++)
                {
                    TextBox tb = new TextBox();
                    tb.ID = i.ToString();
                    Panel1.Controls.Add(tb);
                }
        }    private const string c_ids = "TextBoxIds";
        /// <summary>
        /// 纪录下动态增加的TextBox的ID值
        /// </summary>
        private ArrayList AddedTextBoxIds
        {
            get
            {
                if (ViewState[c_ids] == null)
                    ViewState[c_ids] = new ArrayList();            return ViewState[c_ids] as ArrayList;
            }        set { ViewState[c_ids] = value; }
        }    protected void BT_AddControl_Click(object sender, EventArgs e)
        {
            //获取现在要增加的TextBox的ID索引
            string id = Convert.ToString(AddedTextBoxIds.Count + 1);
            
            TextBox newBox = new TextBox();
            newBox.Width = Unit.Pixel(200);
            newBox.ID = id;
            newBox.Text = "现在是增加的第" + id + "个TextBox";        Panel1.Controls.Add(newBox);
            AddedTextBoxIds.Add(id);    //纪录下新增加的TextBoxID,在下次PostBack时重新加载
        }
        protected void BT_GetControlsValue_Click(object sender, EventArgs e)
        {
            for (int i = 1; i <= AddedTextBoxIds.Count; i++)
            {
                TextBox tb = Panel1.FindControl(i.ToString()) as TextBox;
                if (tb != null)
                { 
                    //这里是加载的TextBox的值
                    //tb.Text....
                    //tb.ID.....            }        }
        }
    }<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AddTextBoxSample.aspx.cs" Inherits="AddTextBoxSample" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>增加动态的TextBox,并取值的例子</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Panel ID="Panel1" runat="server" Height="278px" Width="549px">
            </asp:Panel>
            <asp:Button ID="BT_AddControl" runat="server" OnClick="BT_AddControl_Click" Text="增加一个TextBoxControl" />
            <asp:Button ID="BT_GetControlsValue" runat="server" OnClick="BT_GetControlsValue_Click"
                Text="取得动态加载的TextBox的值" /></div>
        </form>
    </body>
    </html>
      

  6.   

    谢谢llxchen,按照你的代码是可以实现。如果我把TextBox的ID改为"TextBox"+id的话,要什么取?
    这是我稍做修改:
    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;
    public partial class AddTextBoxSample : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ReLoadAddedTextBoxs();
        }    //重新加载已经加载过的TextBox
        private void ReLoadAddedTextBoxs()
        {
                for (int i = 1; i <= AddedTextBoxIds.Count; i++)
                {
                    TextBox tb = new TextBox();
                    tb.ID = "textbox"+i.ToString();
                    Panel1.Controls.Add(tb);
                }
        }    private const string c_ids = "TextBoxIds";
        /// <summary>
        /// 纪录下动态增加的TextBox的ID值
        /// </summary>
        private ArrayList AddedTextBoxIds
        {
            get
            {
                if (ViewState[c_ids] == null)
                    ViewState[c_ids] = new ArrayList();            return ViewState[c_ids] as ArrayList;
            }        set { ViewState[c_ids] = value; }
        }    protected void BT_AddControl_Click(object sender, EventArgs e)
        {
            //获取现在要增加的TextBox的ID索引
            string id = Convert.ToString(AddedTextBoxIds.Count + 1);
            
            TextBox newBox = new TextBox();
            newBox.Width = Unit.Pixel(200);
            newBox.ID ="textbox"+id;
            newBox.Text = "现在是增加的第" + id + "个TextBox";        Panel1.Controls.Add(newBox);
            AddedTextBoxIds.Add(id);    //纪录下新增加的TextBoxID,在下次PostBack时重新加载
        }
        protected void BT_GetControlsValue_Click(object sender, EventArgs e)
        {
            for (int i = 1; i <= AddedTextBoxIds.Count; i++)
            {
                TextBox tb = Panel1.FindControl(i.ToString()) as TextBox;
                if (tb != null)
                { 
    Response.Write("<script>alert('"+tb.ID+"')</script>");            }        }
        }
    }是不是i.ToString()不对,取不id值?请正解!
      

  7.   

    llxchen再请教一个问题:
    我要对生成的textbox进行分组要什么实现?比如一行就能加三个textbox
        private void ReLoadAddedTextBoxs() 
        { 
          Literal br=new Literal();
                  br="<br>";
                for (int i = 1; i  <= AddedTextBoxIds.Count; i++) 
                { 
                    TextBox tb = new TextBox(); 
                    tb.ID = "textbox"+i.ToString(); 
                    Panel1.Controls.Add(tb);
                 if(i%3==0)
                    panel1.Controls.Add(br);
                } 
        } 
    执行效果当i<6时三个为一行,当i<9时6个为一行。为何?
      

  8.   

    是我的话,会先写一个panel试验,看html源文件里的textbox有没有什么规律,不过没试过。