从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代码。
编辑:当我想出来时,我把它放在评论中,但我想我应该将它移到问题中,以便更加明显:
以为我应该更新这个。 我觉得自己有点白痴,但我确实设法让这个工作。 基本上我给控件分配了一个等于替换标记的ID(例如,ID =“$ FIRSTNAME $”)。 我甚至不知道美元会引起任何问题。 当我刚才改为格式ID =“Firstname”时,它完美无缺。 谢谢你的帮助!
你是对的,这完全是关于页面生命周期的 。 必须在Page_Init
阶段重新创建动态创建的控件,以便在viewstate绑定阶段之前存在。 这意味着必须以某种方式(使用Session
,可能)存储您在之前的处理中创建了多少个textboxes
来重新创建它们。 提醒使用相同的ID并将它们添加到控制树(转发器或您正在使用的其他内容)。
UPDATE
让我给你一个建议:1。声明List
类型的类属性(让我们称之为CreatedTextBoxes
)
-
声明一个接收创建文本框所需内容的方法。 此方法不得读取其范围之外的任何内容。 它只会接收一些args,创建文本框并将它们添加到另一个控件(例如
Repeater
)。 将创建的每个文本框添加到CreatedTextBoxes
-
在下拉列表更改事件中,读取选项,将其保存到
Session
并调用此方法 -
在
Page_Init
,在Session
validation该对象。 如果它为null或为空,则不要做任何事情。 如果它有一个值,则调用相同的方法,传递相同的args - 当您需要从动态创建的文本框中检索它时,请使用
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 } } }
- GC.Collect循环?
- 如何确定.NET代码是否在ASP.NET进程中运行?
- 将“average”参数添加到.NET的Random.Next()以获得曲线结果
- 在C#.NET中使用USB PS2手动控制器
- Outlook插件:从选定的日历中获取元素
- Culture-Invariant区分大小写的字符串比较会在不同的计算机上返回不同的结果
- 使用CustomAttributes和GetCustomAttributes()的优势
- 为只读命名管道启用MessageMode时的C#UnauthorizedAccessException(NamedPipeClientStream类)
- Hijri和Gregorian DateTime构造函数