我整个上午一直在反对这一点,所以希望我能得到一些帮助。基本上我在从.net 4中动态创建的一些文本框控件中获取值时遇到问题。
这是应用程序的理想流程。
1)。用户从下拉菜单中选择一个html文档,该菜单是一个字母的模板。这个html文档的格式为$ VARIABLENAME $,将替换为正确的值。
2)。该程序通过模板运行并拉出$ STRING $格式的所有字符串并将它们存储在列表中。
3)。对于此列表中的每个条目,程序生成一个asp:标签和一个asp:textbox,其中包含基于原始$ VARIABLENAME $字段的唯一ID。
4)。用户输入替换值,然后点击提交。
5)。程序用替换值替换所有$ STRING $并输出结果。
一切正常,直到我需要从文本框中获取值。我敢肯定它与页面生命周期的问题,但由于没有被生成的文本框,直到选择使用从下拉列表中选择所需的模板,我不知道如何让他们通过回传坚持,所以我可以引用它们。
我是否认为这一切都错了?在发生回拨事件后,如何访问从下拉事件创建的文本字段?
编辑: 这是大部分相关代码。
protected void createTextBoxes(List<string> 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("<br />"));
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<string> regMatches = FindMatches(templatePath);
Session["regMatches"] = regMatches;
createTextBoxes(regMatches);
}
protected void Page_Init(object sender, EventArgs e)
{
if (Session["regMatches"] != null)
{
createTextBoxes((List<string>)Session["regMatches"]);
}
}
稍后,我正在尝试将这些文本框中的值添加到字典中。参数是字典的名称。关键字段是$ STRING $,结果是用户在文本框中输入的内容。
protected void previewBtn_Click(object sender, EventArgs e)
{
List<string> matchResults = (List<string>)Session["regMatches"];
Dictionary<string, string> parameters = new Dictionary<string, string>();
foreach (string result in matchResults)
{
TextBox tb = (TextBox)templateFormPlaceholder.FindControl(result);
parameters.Add(result, tb.Text);
}
var template = ReplaceKeys(parameters);
outputLBL.Text = template;
这是.aspx代码。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="offerLetter.aspx.cs" Inherits="templateRegexTesting.offerLetter" %>
<!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>
<p>
Which template would you like to use?
</p>
<asp:DropDownList ID="templateDD" runat="server" OnSelectedIndexChanged="templateDD_SelectedIndexChanged"
AutoPostBack="true">
<asp:ListItem></asp:ListItem>
<asp:ListItem Value="1">Employee</asp:ListItem>
<asp:ListItem Value="2">Manager</asp:ListItem>
</asp:DropDownList>
<br />
<asp:PlaceHolder ID="templateFormPlaceholder" runat="server" />
<div>
<asp:Button ID="previewBtn" runat="server" Text="Preview" Visible="false" OnClick="previewBtn_Click" />
</div>
<div>
<asp:Label ID="outputLBL" runat="server"></asp:Label>
</div>
<br />
</div>
</form>
</body>
</html>
编辑:当我弄清楚时,我把它放在评论中,但我想我应该把它移到问题中,以便更明显:
我想我应该更新一下。我觉得自己有点白痴,但我确实设法让这个工作。基本上我给控件分配了一个等于替换标记的ID(例如,ID =“$ FIRSTNAME $”)。我甚至不知道美元会引起任何问题。当我刚才改为格式ID =“Firstname”时,它完美无缺。谢谢你们所有的帮助!
答案 0 :(得分:7)
你是对的,这完全是关于页面生命周期。必须在Page_Init
阶段重新创建动态创建的控件,以便在 viewstate绑定阶段之前存在。这意味着必须以某种方式(使用Session
,可能)存储您在之前的处理中创建了多少textboxes
来重新创建它们。提醒使用相同的ID 并将它们添加到您的控制树(转发器或您正在使用的其他内容)。
<强>更新强>
让我给你一个建议:
1.声明类型为List<TextBox>
的类属性(让我们称之为CreatedTextBoxes
)
声明一个接收创建文本框所需内容的方法。此方法不得读取其范围之外的任何内容。它只会接收一些args,创建文本框并将它们添加到另一个控件(例如Repeater
)。将创建的每个文本框添加到CreatedTextBoxes
在下拉列表更改事件中,阅读该选项,将其保存到Session
并调用此方法
在Page_Init
,验证Session
处的对象。如果它为null或为空,则不要做任何事情。如果它有一个值,则调用相同的方法,传递相同的args
CreatedTextBoxes
而不是FindControls()
答案 1 :(得分:1)
您将TextBox
控件添加到templateFormPlaceholder.Controls
,但使用form1.FindControl
来查找它们。仅当控件直接包含在指定容器中时,FindControl
方法才会找到控件 - 来自http://msdn.microsoft.com/en-us/library/486wc64h.aspx。请尝试拨打templateFormPlaceholder.FindControl
。
答案 2 :(得分:1)
创建动态文本框并将其添加到asp面板,以便您可以轻松访问它。
这是ASP.NET设计元素。
<div class="form-group">
<asp:Panel ID="panel" runat="server" CssClass="form-group">
</asp:Panel>
</div>
生成动态文本框的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
}
}
}