我的代码在C#(page_load
函数)中动态生成TextBox。我可以稍后在代码中访问它吗?它确实给我编译错误,似乎没有工作。有人可以验证吗?
附加问题代码
aContent += "<table>";
aContent += "<tr><td>lablel </td><td style='bla blah'><input type='textbox' id='col-1' name='col-1'/></td></tr> ... 10 such rows here
</table>"
spanMap.InnerHtml = aContent;
内容呈现正常,但recusrive迭代不会返回文本框。我这样叫它
TextBox txt = (TextBox)this.FindControlRecursive(spanMap, "col-1");
// txt = (TextBox) spanMapping.FindControl("col-1"); this does not work too
if (txt != null)
{
txt.Text = "A";
}
答案 0 :(得分:2)
假设您正确持久化,您应该能够使用FindControl
方法在代码隐藏中访问它。根据控件的位置,您可能必须通过控件层次结构递归搜索:
private Control FindControlRecursive(Control root, string id)
{
if (root.ID == id)
{
return root;
}
foreach (Control c in root.Controls)
{
Control t = FindControlRecursive(c, id);
if (t != null)
{
return t;
}
}
return null;
}
使用FindControlRecursive
:
TextBox txt = this.FindControlRecursive(Page.Form, "TextBox1") as TextBox;
if (txt != null)
{
string text = txt.Text;
}
如果仍然无法使用上述方法找到它,请确保在每次回发之后创建控件,在Page_Load
之前,OnInit
,如<span>
。
修改强>
我认为您需要更改向容器添加内容的方式。我不使用Panel
,而是使用TextBox txt = new TextBox();
txt.ID = String.Format("txt_{0}", Panel1.Controls.Count);
Panel1.Controls.Add(txt);
,而不是构建标记,只需在代码隐藏中向控制面板添加控件:
{{1}}
答案 1 :(得分:1)
以下是一个例子:
<%@ Page Language="C#" %>
<script type="text/C#" runat="server">
protected void Page_Load(object sender, EventArgs e)
{
var textBox = new TextBox();
textBox.ID = "myTextBox";
textBox.Text = "hello";
Form1.Controls.Add(textBox);
}
protected void BtnTestClick(object sender, EventArgs e)
{
var textBox = (TextBox)Form1.FindControl("myTextBox");
lblTest.Text = textBox.Text;
}
</script>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form id="Form1" runat="server">
<asp:LinkButton ID="btnTest" runat="server" Text="Click me" OnClick="BtnTestClick" />
<asp:Label ID="lblTest" runat="server" />
</form>
</body>
</html>