访问在飞行中创建的C#中的文本框

时间:2011-11-08 16:55:30

标签: c# asp.net textbox findcontrol

我的代码在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";
 }

2 个答案:

答案 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>