关于动态添加控件(例如:TextBox)的问题

engblind 2010-07-07 09:57:15
有这么一个问题,请各位讨论指教

我需要动态添加 TextBox 控件

要求:

多次添加

比如说,我点一个按钮,就添加一个文本框,再点一下,再加一个,依此类推下去…


注意:

1,不是一次添加多个;是一次添加一个,可以多次添加。
2,不考虑通过 JavaScript 技术实现

补充:

我大概理解的原因,是服务器无法保存动态创建的控件,也查阅了网友的一些文章,但还是不太清楚怎么解决。
...全文
384 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Seven-wz 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 engblind 的回复:]

引用 9 楼 wz361790599 的回复:

后台声明一个静态计数器就行了..


哥,您能详细点吗?

不是很理解,更不太明白怎么去操作…
[/Quote]

在页面后台 声明
static UInt64 CycleCounts=0;

Btn_click事件 CycleCounts+=1; 然后根据此变量 实例相等的 你要的 控件
engblind 2010-07-08
  • 打赏
  • 举报
回复
非常感谢各位的支持!!!
z195389542 2010-07-07
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100707/11/eaa5425a-e9c5-4216-9adb-67a1f8f9408b.html?seed=2053420831&r=66781151#r_66781151
帮忙看下问题!
engblind 2010-07-07
  • 打赏
  • 举报
回复

首先谢谢各位,我正在细读各位的建议…

大家可以继续讨论!!!
qq2013 2010-07-07
  • 打赏
  • 举报
回复
dind
高三石 2010-07-07
  • 打赏
  • 举报
回复
前台代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AddContorl.aspx.cs" Inherits="AddContorl" %>

<!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></title>
</head>
<body>
<form id="form1" runat="server">
<div>
 
<asp:Table ID="Table1" runat="server" BorderWidth="1px" Width="300px">
<asp:TableHeaderRow>

<asp:TableHeaderCell>序号</asp:TableHeaderCell>
<asp:TableHeaderCell>姓名</asp:TableHeaderCell>
<asp:TableHeaderCell>成绩</asp:TableHeaderCell>


</asp:TableHeaderRow>


</asp:Table>

<asp:Button runat="server" Text="添加" ID="add" OnClick="add_Click" />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="打印" />
  
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>
<asp:Button ID="reduce" runat="server" OnClick="reduce_Click" Text="删除" /></div>

</form>
</body>
</html>


后台

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class AddContorl : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

protected override void OnInitComplete(EventArgs e)
{
base.OnInitComplete(e);
if (Session["rowNum"] == null || !Page.IsPostBack)
this.Session.Add("rowNum", 1);

this.initTable();
return;
}

protected void add_Click(object sender, EventArgs e)
{
Session["rowNum"] =1+ Convert.ToInt16(this.Session["rowNum"]);
int rowNum = Convert.ToInt16(this.Session["rowNum"]);

this.Label1.Text += rowNum;

TableRow row = new TableRow();
TableCell cell = new TableCell();

TextBox box = new TextBox();
box.ID = "num_" + rowNum;
cell.Controls.Add(box);
row.Cells.Add(cell);

cell = new TableCell();
box = new TextBox();
box.ID = "name_" + rowNum;
cell.Controls.Add(box);
row.Cells.Add(cell);

cell = new TableCell();
box = new TextBox();
box.ID = "score_" + rowNum;
cell.Controls.Add(box);
row.Cells.Add(cell);

this.Table1.Rows.Add(row);

}
public void initTable()
{

int num=Convert.ToInt16(this.Session["rowNum"]);

this.Label1.Text += " init" + num.ToString();

for(int i=1;i<=num;i++)
{
TableRow row = new TableRow();
TableCell cell = new TableCell();

TextBox box = new TextBox();
box.ID = "num_" + i.ToString();
cell.Controls.Add(box);
row.Cells.Add(cell);

cell = new TableCell();
box = new TextBox();
box.ID = "name_" + i.ToString();
cell.Controls.Add(box);
row.Cells.Add(cell);

cell = new TableCell();
box = new TextBox();
box.ID = "score_" + i.ToString();
cell.Controls.Add(box);
row.Cells.Add(cell);

this.Table1.Rows.Add(row);
}
}


protected void Button1_Click(object sender, EventArgs e)
{
int num = Convert.ToInt16(this.Session["rowNum"]);
string text = "";

text += this.Table1.Rows.Count;
/* for (int i = 1; i <= num; i++)
{
text += ((TextBox)Page.FindControl("num_" + i.ToString())).Text;
text += ((TextBox)Page.FindControl("name_" + i.ToString())).Text;
text += ((TextBox)Page.FindControl("score_" + i.ToString())).Text;
}
*
* */
this.Label1.Text = text;
}
protected void reduce_Click(object sender, EventArgs e)
{
int rowNum = Convert.ToInt16(this.Session["rowNum"]);
if (rowNum > 0)
{
rowNum--;
this.Session["rowNum"] = rowNum;

}

this.Table1.Rows.RemoveAt(rowNum + 1);
}


}

weipt 2010-07-07
  • 打赏
  • 举报
回复
那就每次添加的时候把以前的在加一遍,如加第3次(这个3容易取值,给页面放个label就行),就添加3个,第n次添加,就添加n个。

期待有好的办法
阿彪兄 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wuyq11 的回复:]
Web页面是无状态的,动态添加的是不会自动保存的
在Pager_Load里每次都会执行
protected override void OnLoad(EventArgs e)
{
CreateControl();
}
protected void createbutton_Click(object sender, EventArgs e)
{
if ……
[/Quote]
比较同意,多次添加控件时需要注意的问题就是保存状态,不然下一次刷新页面时新添加的控件可能会丢失
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 luli668 的回复:]
原理:
第一次加载:保存控件ID及其他属性;
第二次加载:读出上一次加载的控件ID及属性,加载上一次的控件及这次你加载的控件,再保存这次你加载的控件的ID及属性。
以此类推...可能这种方法繁琐了点,请其他高手指点...[/Quote]

只要保存ID,不需要保存其它属性,除非控件自身不能保存属性。

当你创建与上一次输出html时相同次序或者ID的控件(不用设置任何属性)的时候,asp.net就会自动从ViewState中按照次序或者ID搜索出控件的所有状态并回填到控件。因此你不需要保存属性,你保存ID的目的只是为了能够重建一个个“没有设置除ID以外其它属性的”控件。
luli668 2010-07-07
  • 打赏
  • 举报
回复
mark,确实是如此,第一次动态加载控件成功,但下一次再添加控件的时候,上一次加载的控件就没有了...这个是个好问题,我觉得也能够解决,每次加载控件时,把控件ID及你绑定的属性都保存在ViewState里面,下次动态加载的时候又读出来继续加载。
原理:
第一次加载:保存控件ID及其他属性;
第二次加载:读出上一次加载的控件ID及属性,加载上一次的控件及这次你加载的控件,再保存这次你加载的控件的ID及属性。
以此类推...可能这种方法繁琐了点,请其他高手指点...
wuyq11 2010-07-07
  • 打赏
  • 举报
回复
Web页面是无状态的,动态添加的是不会自动保存的
在Pager_Load里每次都会执行
protected override void OnLoad(EventArgs e)
{
CreateControl();
}
protected void createbutton_Click(object sender, EventArgs e)
{
if (ViewState["CreateControl"] == null)
{
ViewState["CreateControl"] = true;
CreateControl();
}
}
通过ViewState记录增加的数据,在Post_Load里判断不符合添加

engblind 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wz361790599 的回复:]

后台声明一个静态计数器就行了..
[/Quote]

哥,您能详细点吗?

不是很理解,更不太明白怎么去操作…
Seven-wz 2010-07-07
  • 打赏
  • 举报
回复
后台声明一个静态计数器就行了..
engblind 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sandy945 的回复:]

http://topic.csdn.net/u/20100315/17/a7256b4d-f6fa-4066-9e02-341e1540776a.html


有一定的参考意义,但是其间有一种方法应该也是依靠 JavaScript 才实现的吧…

诸如:
[Quote]
<asp:LinkButton ID="lbtnAdd" runat="server" OnClientClick="document.getElementById('hID').value=1;" Text="add" />
[/Quote]
engblind 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 amandag 的回复:]

不考虑通过 JavaScript 技术实现
==
每加一个文本框页面刷新一下用户也够痛苦的
[/Quote]

这个了解,我这个问题纯属技术性讨论,与业务无关!!
amandag 2010-07-07
  • 打赏
  • 举报
回复
不考虑通过 JavaScript 技术实现
==
每加一个文本框页面刷新一下用户也够痛苦的
engblind 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yisuku_lee 的回复:]

页面放一个容器。然后往容器中添加

C# code

Panel p = new Panel();//页面容器。如果页面放置了Panel 且命名为Panel1 则 直接Panel1.Controls.Add(t);即可

TextBox t = new TextBox {ID = "t1", Text = "aaa"};
p.Controls.Add(t);
[/Quote]

原理是这样的,但是简单这样的操作,只能增加一次;当第二次点击增加的时候,第一次增加的就没有了
geass 2010-07-07
  • 打赏
  • 举报
回复
TextBox TextBox = new TextBox();
TextBox.ID = "TextBox" + i.ToString();
TextBox.Text = "";
PlaceHolder1.Controls.Add(lblType);
YISUKU_LEE 2010-07-07
  • 打赏
  • 举报
回复
页面放一个容器。然后往容器中添加


Panel p = new Panel();//页面容器。如果页面放置了Panel 且命名为Panel1 则 直接Panel1.Controls.Add(t);即可

TextBox t = new TextBox {ID = "t1", Text = "aaa"};
p.Controls.Add(t);
加载更多回复(4)

62,052

社区成员

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

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

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

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