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语句中的断点甚至不会触发一次。实际上我不清楚你想要实现什么(是的,不工作。似乎我的问题是没有正确创建文本框。你能发布用于创建文本框的代码吗