在C#Visual Studio中调用动态创建的文本框
在本文中,我想了解如何在C#Visual Studio中创建动态创建的文本框 但是,当我尝试在代码中稍后调用这些动态创建的文本框的ID以确定用户输入的文本时,我得到一个错误,即这些ID在当前上下文中不存在。有人知道我如何称呼这些吗?归功于 这是我的全部代码:在C#Visual Studio中调用动态创建的文本框,c#,asp.net,C#,Asp.net,在本文中,我想了解如何在C#Visual Studio中创建动态创建的文本框 但是,当我尝试在代码中稍后调用这些动态创建的文本框的ID以确定用户输入的文本时,我得到一个错误,即这些ID在当前上下文中不存在。有人知道我如何称呼这些吗?归功于 这是我的全部代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Linq;
namespace WebApplication4
{
public partial class WebForm15 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsCallback)
{
//credit to https://stackoverflow.com/questions/44076955/adding-additional-textboxes-to-aspx-based-on-xml#comment75336978_44078684
const string xml = @"<Number>
<Num>1</Num>
<Num>2</Num>
<Num>3</Num>
</Number>";
XDocument doc = XDocument.Parse(xml);
int i = 0;
foreach (XElement num in doc.Root.Elements())
{
TextBox box = new TextBox
{
ID = "dynamicTextBox" + i,
Text = num.Value,
ReadOnly = false
};
divToAddTo.Controls.Add(box);
divToAddTo.Controls.Add(new LiteralControl("<br/>"));
i++;
}
}
}
protected void BtnGetValues_Click(object sender, EventArgs e)
{
IList<string> valueReturnArray = new List<string>();
foreach (Control d in divToAddTo.Controls)
{
if (d is TextBox)
{
valueReturnArray.Add(((TextBox)d).Text);
}
}
//valueReturnArray will now contain the values of all the textboxes
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用System.Xml.Linq;
命名空间WebApplication4
{
公共部分类WebForm15:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!Page.IsCallback)
{
//归功于https://stackoverflow.com/questions/44076955/adding-additional-textboxes-to-aspx-based-on-xml#comment75336978_44078684
常量字符串xml=@“
1.
2.
3.
";
XDocument doc=XDocument.Parse(xml);
int i=0;
foreach(doc.Root.Elements()中的XElement num)
{
TextBox=新的TextBox
{
ID=“dynamicTextBox”+i,
Text=数值,
只读=假
};
divToAddTo.Controls.Add(框);
添加(新的LiteralControl(“
”);
i++;
}
}
}
受保护的无效BtnGetValues\u单击(对象发送方,事件参数e)
{
IList valueReturnArray=新列表();
foreach(divToAddTo.Controls中的控件d)
{
如果(d是文本框)
{
valueReturnArray.Add(((文本框)d).Text);
}
}
//valueReturnArray现在将包含所有文本框的值
}
}
}
这里是aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm15.aspx.cs" Inherits="WebApplication4.WebForm15" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
</head>
<body>
<form id="form1" runat="server">
<div id="divToAddTo" runat="server" />
<asp:Button runat="server" ID="BtnGetValues" Text="GetValues" OnClick="BtnGetValues_Click" />
</form>
</body>
</html>
找到了答案!!!这是我在网上搜索了几个小时后发现的 解决方案: 使用动态控件时,必须记住,它们仅在下次回发之前存在。ASP.NET不会重新创建动态添加的控件。如果需要多次重新创建控件,则应在PageLoad事件处理程序中执行控件创建(因为当前仅使用条件:!IsPostabck首次创建文本框)。这样做的另一个好处是允许您在动态控件中使用视图状态。尽管视图状态通常在Page.Load事件之前恢复,但如果在处理程序中为PageLoad事件创建控件,ASP.NET将在PageLoad事件处理程序结束后应用其拥有的任何视图状态信息 因此,删除条件:!IsPostback,这样每次加载页面时,也会创建TextBox控件。您还将看到PageLoad处理程序完成后保存的文本框的状态。[显然您没有禁用ViewState!!!] 例如: 受保护的无效页面加载(对象发送方、事件参数e) { }
现在,在运行它之后,在文本框中键入任何内容,并查看当您单击导致回发的任何按钮时会发生什么。文本框仍然保持其状态 确保在每次回发时都重新创建动态控件。@VDWWD这是什么意思?你能举个例子吗?我在这里尝试了你的答案,它给了我一个空字符串列表。你知道为什么或者如何解决这个问题吗?@Blah Blah请试试我的回复。如果我还能帮你什么,请告诉我。我认为我的问题是,用户输入信息,当按下按钮保存数据时,会出现回发,并删除文本框和其中创建的内容。因此,我所有的文本框都是空字符串。另外,作为旁注,文本框由用户填充,而xml确定需要多少文本框。如果您有任何其他解决方案,将不胜感激
TextBox txtBox = new TextBox();
// Assign some text and an ID so you can retrieve it later.
txtBox.ID = "newButton";
PlaceHolder1.Controls.Add(txtBox);