Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET中单击按钮时迭代所有动态生成的文本框_C#_Asp.net_.net_Webforms - Fatal编程技术网

C# 在ASP.NET中单击按钮时迭代所有动态生成的文本框

C# 在ASP.NET中单击按钮时迭代所有动态生成的文本框,c#,asp.net,.net,webforms,C#,Asp.net,.net,Webforms,当点击“下载”按钮时,我需要遍历页面上所有动态生成的文本框。以下代码不返回任何内容: protected void Download_Click(object sender, EventArgs e) { //??? foreach (Control child in this.form1.Controls) { if (child.GetType().ToString().Equals("System.Web.UI.Web

当点击“下载”按钮时,我需要遍历页面上所有动态生成的文本框。以下代码不返回任何内容:

    protected void Download_Click(object sender, EventArgs e)
    { //???
        foreach (Control child in this.form1.Controls)
        {
            if (child.GetType().ToString().Equals("System.Web.UI.WebControls.TextBox")) //child is somehow never textbox
            {
                TextBox textBox = (TextBox)child;
                System.Diagnostics.Debug.WriteLine(textBox.Text);
            }
        }
    }
我通过调用AddTextbox函数创建文本框:

    private void AddTextbox(string id, bool isNumber)
    {
        TextBox textBox = new TextBox();
        textBox.ID = id; //set ID
        if (isNumber){ textBox.Attributes.Add("type", "number"); }; //if only numbers can be added, html attribute 'type = "number"' is added
        form1.Controls.Add(textBox);
        form1.Controls.Add(new LiteralControl("<br />")); //just add <br /> html element            
    }
private void AddTextbox(字符串id,bool isNumber)
{
TextBox TextBox=新建TextBox();
textBox.ID=ID;//设置ID
if(isNumber){textBox.Attributes.Add(“type”,“number”);};//如果只能添加数字,则添加html属性“type=”number“
form1.Controls.Add(文本框);
form1.Controls.Add(新的LiteralControl(“
”);//只需添加
html元素 }
您是否尝试了
此.Form.Controls
而不是
此.Controls
指的是
.aspx
页面,
文本框
通常不是页面的直接子项,它应该是表单的子项。

是否尝试了
此.Form.Controls
而不是
此.Controls
指的是
.aspx
页面,
文本框
通常不是页面的直接子项,它应该是表单的子项。

您遇到的问题是,尽管您正在创建要显示在页面上的文本框,但当调用下载按钮单击方法时,它们不再存在

最初加载页面时,您正在创建文本框,并呈现包含这些文本框的html

单击下载按钮时,会发生回发。这实际上是调用页面的一个新实例。因此,此时还没有创建文本框

因此,在访问form1.Controls下的文本框之前,首先需要使用最初创建它们的相同方法重新创建它们。但是,它们不会具有通过浏览器输入的值

但是,这些数据应该在post表单中,因此您需要修改AddTextBox方法以尝试从post数据中获取数据。比如:

private void AddTextbox(string id, bool isNumber)
{
    TextBox textBox = new TextBox();
    textBox.ID = id; //set ID
    if (isNumber){ textBox.Attributes.Add("type", "number"); }; //if only numbers can be added, html attribute 'type = "number"' is added
    if (Page.IsPostBack)
    {
        // set value from passed form data
        textbox.Text = Request.Form[id];
    }
    form1.Controls.Add(textBox);
    form1.Controls.Add(new LiteralControl("<br />")); //just add <br /> html element            
}
private void AddTextbox(字符串id,bool isNumber)
{
TextBox TextBox=新建TextBox();
textBox.ID=ID;//设置ID
if(isNumber){textBox.Attributes.Add(“type”,“number”);};//如果只能添加数字,则添加html属性“type=”number“
如果(第IsPostBack页)
{
//从传递的表单数据设置值
textbox.Text=Request.Form[id];
}
form1.Controls.Add(文本框);
form1.Controls.Add(新的LiteralControl(“
”);//只需添加
html元素 }

我不确定,但您可能还需要设置textbox.clientdmode=static,以便表单的html以您指定的确切ID呈现。

您遇到的问题是,尽管您正在创建要显示在页面上的文本框,但当调用下载按钮单击方法时,它们不再存在

最初加载页面时,您正在创建文本框,并呈现包含这些文本框的html

单击下载按钮时,会发生回发。这实际上是调用页面的一个新实例。因此,此时还没有创建文本框

因此,在访问form1.Controls下的文本框之前,首先需要使用最初创建它们的相同方法重新创建它们。但是,它们不会具有通过浏览器输入的值

但是,这些数据应该在post表单中,因此您需要修改AddTextBox方法以尝试从post数据中获取数据。比如:

private void AddTextbox(string id, bool isNumber)
{
    TextBox textBox = new TextBox();
    textBox.ID = id; //set ID
    if (isNumber){ textBox.Attributes.Add("type", "number"); }; //if only numbers can be added, html attribute 'type = "number"' is added
    if (Page.IsPostBack)
    {
        // set value from passed form data
        textbox.Text = Request.Form[id];
    }
    form1.Controls.Add(textBox);
    form1.Controls.Add(new LiteralControl("<br />")); //just add <br /> html element            
}
private void AddTextbox(字符串id,bool isNumber)
{
TextBox TextBox=新建TextBox();
textBox.ID=ID;//设置ID
if(isNumber){textBox.Attributes.Add(“type”,“number”);};//如果只能添加数字,则添加html属性“type=”number“
如果(第IsPostBack页)
{
//从传递的表单数据设置值
textbox.Text=Request.Form[id];
}
form1.Controls.Add(文本框);
form1.Controls.Add(新的LiteralControl(“
”);//只需添加
html元素 }

我不确定,但您可能还需要设置textbox.ClientIdMode=static,以便使用您指定的确切ID呈现表单的html。

以下是您希望实现的完整工作示例:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication1.WebForm2" %>

<!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:Panel ID="pnlTextBoxes" runat="server">
</asp:Panel>
    <asp:Button ID="btnAdd" runat="server" Text="Add New" OnClick="AddTextBox" />
    <asp:Button ID="btnGet" runat="server" Text="Download" OnClick="Download_Click" />

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


)

以下是您想要实现的完整工作示例:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication1.WebForm2" %>

<!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:Panel ID="pnlTextBoxes" runat="server">
</asp:Panel>
    <asp:Button ID="btnAdd" runat="server" Text="Add New" OnClick="AddTextBox" />
    <asp:Button ID="btnGet" runat="server" Text="Download" OnClick="Download_Click" />

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


)

是否在表单init上重新创建动态创建的文本框?此外,如果文本框不是直接位于表单上,则需要迭代控件的子控件。不,我想我不是。我用一个函数创建它们,然后用第二个函数迭代它们以填充值,然后我尝试下载它们,如本问题所示。我可以请您提供一些参考资料或教程,我可以根据这些参考资料或教程来做这件事吗?>第二个问题:是的,你是对的,我也需要解决这个问题。除了诊断,你调试它吗?是的。孩子永远不会是文本框,if语句中的断点甚至不会触发一次。实际上我不清楚你们想要实现什么(是否在表单init上重新创建动态创建的文本框?此外,如果文本框不直接位于表单上,则需要迭代控件的子控件。不,我想不是。我使用一个函数创建它们,然后使用第二个函数迭代它们以填充值,然后我尝试下载它们,如本问题所示。可以吗我问你一些参考资料或教程,我可以根据它们来做这件事?>第二个问题:是的,你是对的,我也需要解决这个问题。除了诊断,你调试它吗?是的。孩子永远不会是文本框,if语句中的断点甚至不会触发一次。实际上我不清楚你想要实现什么(是的,不工作。似乎我的问题是没有正确创建文本框。你能发布用于创建文本框的代码吗