asp.net 动态添加控件 每点击“添加按钮” 页面创建一个Textbox(后台可以访问到值的)。
eg这个是163邮箱,我每次点击“添加附件”的时候都创建一个Textbox。最后点击“发信”后天可以获取Textbox中的值。...
eg这个是163邮箱,我每次点击“添加附件”的时候都创建一个Textbox。最后点击“发信”后天可以获取Textbox中的值。
展开
4个回答
展开全部
我简单看了下 实际上的一个主要问题就是动态控件状态在回传后的保存问题 即你动态创建了一个控件 在回传后却发现控件不见了或者被新的覆盖了!
要解决这个问题很简单 只要保存控件的视图状态就可以了 我们可以用viewstate来保存 也可以用静态变量来保存 由于aspx页面周期在每次load事件里都会还原视图数据 所以后台添加的控件会被从清理掉 需要手工编码恢复 下面是一个简单示例 当然你可以使用viewstate 我用的静态变量
aspx前台代码:
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="button1" runat="server" Text="创建" onclick="Button1_Click" />
<asp:Panel ID="Panel1" runat="server">
</asp:Panel>
<asp:Button ID="id2" runat="server" Text="获取所有值" onclick="id2_Click" />
</div>
</form>
</body>
后台代码:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//还原控件
RestoreTextBox();
}
//静态变量存储控件列表
static List<TextBox> txtlist = new List<TextBox>();
//控件id
static int id = 1;
protected void Button1_Click(object sender, EventArgs e)
{
var txt = new TextBox
{
ID=id.ToString(),
Text="Sample textbox " + id.ToString()
};
this.Panel1.Controls.Add(txt);
txtlist.Add(txt);
//id自增1
id++;
}
/// <summary>
/// 还原控件
/// </summary>
void RestoreTextBox()
{
foreach (var item in txtlist)
{
if (item != null)
{
this.Panel1.Controls.Add(item);
}
}
}
/// <summary>
/// 读取textbox的值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void id2_Click(object sender, EventArgs e)
{
foreach (Control item in Panel1.Controls)
{
if (item is TextBox)
{
Response.Write((item as TextBox).Text+"</br>");
}
}
}
}
要解决这个问题很简单 只要保存控件的视图状态就可以了 我们可以用viewstate来保存 也可以用静态变量来保存 由于aspx页面周期在每次load事件里都会还原视图数据 所以后台添加的控件会被从清理掉 需要手工编码恢复 下面是一个简单示例 当然你可以使用viewstate 我用的静态变量
aspx前台代码:
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="button1" runat="server" Text="创建" onclick="Button1_Click" />
<asp:Panel ID="Panel1" runat="server">
</asp:Panel>
<asp:Button ID="id2" runat="server" Text="获取所有值" onclick="id2_Click" />
</div>
</form>
</body>
后台代码:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//还原控件
RestoreTextBox();
}
//静态变量存储控件列表
static List<TextBox> txtlist = new List<TextBox>();
//控件id
static int id = 1;
protected void Button1_Click(object sender, EventArgs e)
{
var txt = new TextBox
{
ID=id.ToString(),
Text="Sample textbox " + id.ToString()
};
this.Panel1.Controls.Add(txt);
txtlist.Add(txt);
//id自增1
id++;
}
/// <summary>
/// 还原控件
/// </summary>
void RestoreTextBox()
{
foreach (var item in txtlist)
{
if (item != null)
{
this.Panel1.Controls.Add(item);
}
}
}
/// <summary>
/// 读取textbox的值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void id2_Click(object sender, EventArgs e)
{
foreach (Control item in Panel1.Controls)
{
if (item is TextBox)
{
Response.Write((item as TextBox).Text+"</br>");
}
}
}
}
追问
太感谢了 分会给你的~! 我还有一个问题
//静态变量存储控件列表
static List txtlist = new List();
这个在多用户并发的时候 会有问题么?再次感谢
追答
应该没问题吧 实在不行用viewstate存储List就行了 需要时强转回List viewstate是比较安全的
展开全部
简单,在后台通过request.form["name"]就行了!前提是页面的html控件必须设置name值
request.form["name"]找的是控件的name
request.form["name"]找的是控件的name
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用repeater,每点击一次添加按钮,就给repeater的资料源添加一个空行,然后重新绑定repeater,再显示就多一个textbox了。
repeater的格式就是放textbox和已有值的值信息。
repeater的格式就是放textbox和已有值的值信息。
追问
repeater的资料源添加一个空行 没懂 能给一个简单的示例代码么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你还不如没事点击添加附件的时候 显示出一个textbox的 然后点击发信后 通过脚本去把这个textbox的值放入到一个固定的(服务器控件) 隐藏域 或者其它的地方,这样后台就可以取到。你原来那样每次都要去创建一个服务器控件的 我不知道行不行,我只是怀疑你的后台中的代码怎么取到这个新增的控件(或者很多个)。
追问
我开始 使用的是 ASP:Table 动态添加行(在行中添加Textbox) 但是每次回传的时候 Table的状态就没了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询