从asp.net中动态创建的文本框中获取文本

我整个上午一直在反对这个,所以希望我能得到一些帮助。 基本上我有问题从一些文本框控件获取值我在.net 4中动态创建。

这是应用程序的理想流程。

1)。 用户从下拉菜单中选择一个html文档,该菜单是一个字母的模板。 这个html文档包含格式$ VARIABLENAME $的标签,将用正确的值替换。

2)。 该程序通过模板运行并拉出$ STRING $格式的所有字符串并将它们存储在列表中。

3)。 对于此列表中的每个条目,程序生成一个asp:标签和一个asp:textbox,其中包含基于原始$ VARIABLENAME $字段的唯一ID。

4)。 用户输入替换值,然后点击提交。

5)。 程序用替换值替换所有$ STRING $并输出结果。

一切正常,直到我需要从文本框中获取值。 我很确定它是页面生命周期的一个问题,但是因为在使用从下拉列表中选择所需的模板之前不会生成文本框,所以我不确定如何通过回发使它们持久化以便我可以引用它们。

我错了吗? 在发生回拨事件后,如何访问从下拉事件创建的文本字段?

编辑:这是相关代码的大部分内容。

protected void createTextBoxes(List results) { if (results != null) { foreach (string result in results) { string formattedResult = result.Substring(1, result.Length - 2); formattedResult = formattedResult.ToLower(); formattedResult = char.ToUpper(formattedResult[0]) + formattedResult.Substring(1); var label = new Label(); label.ID = formattedResult; label.Text = formattedResult + ": "; templateFormPlaceholder.Controls.Add(label); var textBox = new TextBox(); textBox.ID = result; templateFormPlaceholder.Controls.Add(textBox); templateFormPlaceholder.Controls.Add(new LiteralControl("
")); previewBtn.Visible = true; } } } protected void templateDD_SelectedIndexChanged(object sender, EventArgs e) { var templatePath = ""; if (templateDD.SelectedIndex == 0) { previewBtn.Visible = false; } if (templateDD.SelectedIndex == 1) { templatePath = employeePath; } else if (templateDD.SelectedIndex == 2) { templatePath = managerPath; } List regMatches = FindMatches(templatePath); Session["regMatches"] = regMatches; createTextBoxes(regMatches); } protected void Page_Init(object sender, EventArgs e) { if (Session["regMatches"] != null) { createTextBoxes((List)Session["regMatches"]); } }

稍后,我正在尝试将这些文本框中的值添加到字典中。 参数是字典的名称。 关键字段是$ STRING $,结果是用户在文本框中输入的内容。

  protected void previewBtn_Click(object sender, EventArgs e) { List matchResults = (List)Session["regMatches"]; Dictionary parameters = new Dictionary(); foreach (string result in matchResults) { TextBox tb = (TextBox)templateFormPlaceholder.FindControl(result); parameters.Add(result, tb.Text); } var template = ReplaceKeys(parameters); outputLBL.Text = template; 

这是.aspx代码。

        

Which template would you like to use?

Employee Manager

编辑:当我想出来时,我把它放在评论中,但我想我应该将它移到问题中,以便更加明显:

以为我应该更新这个。 我觉得自己有点白痴,但我确实设法让这个工作。 基本上我给控件分配了一个等于替换标记的ID(例如,ID =“$ FIRSTNAME $”)。 我甚至不知道美元会引起任何问题。 当我刚才改为格式ID =“Firstname”时,它完美无缺。 谢谢你的帮助!

你是对的,这完全是关于页面生命周期的 。 必须在Page_Init阶段重新创建动态创建的控件,以便在viewstate绑定阶段之前存在。 这意味着必须以某种方式(使用Session ,可能)存储您在之前的处理中创建了多少个textboxes来重新创建它们。 提醒使用相同的ID并将它们添加到控制树(转发器或您正在使用的其他内容)。


UPDATE

让我给你一个建议:1。声明List类型的类属性(让我们称之为CreatedTextBoxes

  1. 声明一个接收创建文本框所需内容的方法。 此方法不得读取其范围之外的任何内容。 它只会接收一些args,创建文本框并将它们添加到另一个控件(例如Repeater )。 将创建的每个文本框添加到CreatedTextBoxes

  2. 在下拉列表更改事件中,读取选项,将其保存到Session并调用此方法

  3. Page_Init ,在Sessionvalidation该对象。 如果它为null或为空,则不要做任何事情。 如果它有一个值,则调用相同的方法,传递相同的args

  4. 当您需要从动态创建的文本框中检索它时,请使用CreatedTextBoxes而不是FindControls()

您将TextBox控件添加到templateFormPlaceholder.Controls但使用form1.FindControl来查找它们。 只有控件直接包含在指定容器中时, FindControl方法才会找到控件 – 来自http://msdn.microsoft.com/en-us/library/486wc64h.aspx 。 请尝试调用templateFormPlaceholder.FindControl

创建动态文本框并将其添加到asp面板,以便您可以轻松访问它。

这是ASP.NET设计元素。

 

C#代码生成动态文本框

  protected void create_dynamic_text(object sender, EventArgs e) { int num = 5; // you can give the number here for (int i = 0; i < num;i++ ) { TextBox tb = new TextBox(); tb.ID = "txt_box_name" + i.ToString(); tb.CssClass = "add classes if you need"; tb.Width = 400; //Manage width and height panel.Controls.Add(tb); //panel is my ASP.Panel object. Look above for the design code of ASP panel } } 

C#代码取值

  protected void reade_values(object sender, EventArgs e) { int num=5; // your count goes here TextBox tb = new TextBox(); for (int i = 0; i < num; i++) { tb=(TextBox)panel.FindControl("txt_box_name"+i.ToString()); string value = tb.Text; //You have the data now } } }