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) { //操作 } }
还是不行呀 为null值,这是为什么?Panel可以找的到!
TextBox txtctl=Panel1.FindControl('ID') as TextBox;先这样找到 然后在 遍历下就找到值了
问题是我一个也找不着,更别说遍历了。 TextBox t1=(TextBox)FindControl("textbox1"); TextBox t1=dn.FindContol("textbox1") as TextBox;这两种写法都找不着呀,为null而 Panel p1=(Panel)FindControl("dn"); p1就可以找的着。
我按你这个要求写了一个例子,动态加载的控件需要在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 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)
{
//操作
}
}
为null值,这是为什么?Panel可以找的到!
TextBox t1=(TextBox)FindControl("textbox1");
TextBox t1=dn.FindContol("textbox1") as TextBox;这两种写法都找不着呀,为null而
Panel p1=(Panel)FindControl("dn");
p1就可以找的着。
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>
这是我稍做修改:
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值?请正解!
我要对生成的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个为一行。为何?