在C#Visual Studio中调用动态创建的文本框

在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.

在本文中,我想了解如何在C#Visual Studio中创建动态创建的文本框

但是,当我尝试在代码中稍后调用这些动态创建的文本框的ID以确定用户输入的文本时,我得到一个错误,即这些ID在当前上下文中不存在。有人知道我如何称呼这些吗?

归功于

这是我的全部代码:

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);