动态添加textbox,不能获取其值

hu_service 2009-10-17 02:31:29
动态添加textbox,不能获取其值,不知什么原因。

页面代码:

<body>
<form id="form1" runat="server">
<div>
<asp:Panel ID="Panel1" runat="server">
</asp:Panel>
<hr />
<asp:Button ID="Button1" runat="server" Text="添加" onclick="Button1_Click" />  
<asp:Button ID="Button2" runat="server" Text="获取" onclick="Button2_Click" />
</div>
</form>
</body>

后台代码:

protected void Button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 3; i++)
{
TextBox txt = new TextBox();
txt.ID ="txt"+i.ToString();
Panel1.Controls.Add(txt);
}
}
protected void Button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < 3; i++)
{
TextBox txt = (TextBox)Panel1.FindControl("txt" + i.ToString());
if(txt!=null)
{
txt.Text = "ok";
}
}
}

页面生成后的源文件:
<div>
<div id="Panel1">

<input name="txt0" type="text" id="txt0" /><input name="txt1" type="text" id="txt1" /><input name="txt2" type="text" id="txt2" />
</div>
<hr />
<input type="submit" name="Button1" value="添加" id="Button1" />  
<input type="submit" name="Button2" value="获取" id="Button2" />
</div>

无法获取其值,总是为null,不知道什么原因。

...全文
613 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
上面的demo可能在点击新增按钮时如果需求更进一步,可能是有bug的。

可以再参考另外一个demo:http://topic.csdn.net/u/20090923/12/ce7c0782-69b3-421c-93e1-a51a00097d57.html
zpx3243 2009-10-17
  • 打赏
  • 举报
回复
动态添加的控件,需要在PostBack时,重新创建,
这样在后续的 PostBackEvent中才能访问到动态创建的控件和控件的值。

原因:每次PostBack时,Page对象都是重新创建的,所以动态控件也需要重新创建。
这样,才会将 Request.Form 里的值 绑定到已经创建好的控件上。

要理解asp.net页面生存周期:
①页面初始化 >>>>>>>> 每次PostBakc时,Page对象都是重新创建的。②加载视图状态
③回传数据处理
④页面加载
⑤RaisePostBackChanged事件
⑥回传事件处理>>>>>>>要想,在回发事件处理中获取动态控件,必须在页面加载时,重新创建动态控件。
⑦页面预返回阶段
⑧保存ViewState
⑨页面返回阶段
⑩销毁对象
itliyi 2009-10-17
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 sp1234 的回复:]
这里的控制流程稍微有一点“偷懒”,更为规范的流程大概在帖子《动态加载用户控件,值怎么存起来?》中我所写的一个demo程序。那里,逐次插入一个ascx实例,而且可以选择删除中间的任何一个部件实例。既然可以管理整个ascx,当然ascx中可以包括“任意复杂”的东西。
[/Quote]前辈
itliyi 2009-10-17
  • 打赏
  • 举报
回复
点击按钮重新加载了一次页面 怎么能得到值
  • 打赏
  • 举报
回复
这里的控制流程稍微有一点“偷懒”,更为规范的流程大概在帖子《动态加载用户控件,值怎么存起来?》中我所写的一个demo程序。那里,逐次插入一个ascx实例,而且可以选择删除中间的任何一个部件实例。既然可以管理整个ascx,当然ascx中可以包括“任意复杂”的东西。
  • 打赏
  • 举报
回复
给你写个demo好好研究一下控制流程:
<%@ Page Language="C#" %>

<script runat="server">

protected void Page_Load(object sender, EventArgs e)
{
CreateTextboxes(false);
}

private void CreateTextboxes(bool loadcompleted)
{
this.pnlTest.Controls.Clear();
int num = 上一次输出html时的动态文本框数量;
for (int i = 0; i < num; i++)
{
TextBox txtAdd = new TextBox();
txtAdd.ID = "txtIMEI" + (i + 1);
this.pnlTest.Controls.Add(txtAdd);
if (loadcompleted)
txtAdd.Text = "IMEI" + (i + 1);
}
}

private int 上一次输出html时的动态文本框数量
{
get
{
object x = ViewState["上一次输出html时的动态文本框数量"];
if (x == null)
{
x = 0;
ViewState["上一次输出html时的动态文本框数量"] = x;
}
return (int)x;
}
set
{
ViewState["上一次输出html时的动态文本框数量"] = value;
}
}

protected void Button1_Click(object sender, EventArgs e)
{
string result = string.Empty;
foreach (Control ctrl in this.pnlTest.Controls)
result += (result == string.Empty ? ", " : "") + ((TextBox)ctrl).Text + ",";
this.TextBox1.Text = result;
}

protected void Button2_Click(object sender, EventArgs e)
{
上一次输出html时的动态文本框数量 = int.Parse(this.TextBox2.Text.Trim());
CreateTextboxes(true);
}
</script>

<!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 id="Head1" runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<asp:Panel ID="pnlTest" runat="server">
</asp:Panel>
输入你要创建的TextBox数量:
<asp:TextBox ID="TextBox2" runat="server" Width="20px" Text="2"></asp:TextBox>
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="生成TextBox" /><br />
<asp:TextBox ID="TextBox1" runat="server" Width="698px"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="获取值" />
<br />
<br />
<asp:Button ID="abc" runat="server" Text="最基本测试" /><br />
</form>
</body>
</html>


再最后有一个按钮“最基本测试”。其实这个按钮什么都不做,就是让你在开发asp.net程序时随机地点击用来测试你是否正常地维系了页面的状态。当你连续点击这个本来什么也不干的按钮时候,发现页面上的东西不见了,或者状态混乱了,那么你就不要再去开发什么其它的asp.net程序了,赶紧搞懂状态维系机制吧,否则后患无穷。#20楼的“打包票”是经不起这种随便插入一个按钮的最简单测试的。
lighwind 2009-10-17
  • 打赏
  • 举报
回复
//点击添加所触发的事件
protected void ButtonAdd_Click(object sender, EventArgs e)
{
TextBox text = new TextBox();
text.ID = "TextBox3";
Panel1.Controls.Add(text);

}
//点击获得按钮所触发的事件
protected void ButtonGet_Click(object sender, EventArgs e)
{
Response.Write(Request.Form["TextBox3"]);
}
你再试一下 我再 Page_Load中就没有写代码 已经试过了 你再好好看一下 肯定能实现的 我打包票
hu_service 2009-10-17
  • 打赏
  • 举报
回复
动态添加的事件不要写到pageload里,两个事件分别用button
lighwind 2009-10-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 hu_service 的回复:]
3楼的试了一下不能获得啊
[/Quote]
不是吧 我是过了 可以获得的啊 不过页面好像刷新了
你动态添加的控件 没有了 不过值是确定取得了 你是怎样获得的啊
hu_service 2009-10-17
  • 打赏
  • 举报
回复
3楼的试了一下不能获得啊
lighwind 2009-10-17
  • 打赏
  • 举报
回复
顶一下 3楼的楼主
likevs 2009-10-17
  • 打赏
  • 举报
回复
13楼非常GOOD
hrbwgs1111 2009-10-17
  • 打赏
  • 举报
回复
获取动态的textbox值的方法3楼正解
hrbwgs1111 2009-10-17
  • 打赏
  • 举报
回复
可以在page_load里加上一个session在aspx里放上服务器端脚本,button生成后就把值保存到session中,这样再有按钮提交后,session里的值还是能显示出来的
likevs 2009-10-17
  • 打赏
  • 举报
回复
页面的生命周期问题,页面上所有控件元素的视图状态,是在Init事件之后,page_load事件之前的一个我忘了名称的事件中进行保存的,

后面再动态添加进去的,不能保存视图了,

应该有解决之道,不过我不会,呵呵
小_虎 2009-10-17
  • 打赏
  • 举报
回复
建议用js添加,然后异步传值获取。

-----

不知道用UpdatePanel能不能实现,你的需求
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 successful_cdr 的回复:]
    protected void Button2_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 3; i++)
        {
            Response.Write(Request.Form["txt" + i]);
        }
    }
这样就可以读到
[/Quote]
楼主正解
hu_service 2009-10-17
  • 打赏
  • 举报
回复
跳转就更不合适了,不管怎样还是要谢谢楼上的
hrbwgs1111 2009-10-17
  • 打赏
  • 举报
回复
补充一下,在button事件里写跳转
hrbwgs1111 2009-10-17
  • 打赏
  • 举报
回复
可以另作一个页,跳转的时候带上要生成的text控件,你说的直接在button里做没有试过
加载更多回复(6)

62,050

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧