无法在动态创建的System.Web.UI.WebControl上使用Control.FindControl

kta*_*m33 5 .net asp.net

为什么以下代码不起作用?我正在创建一个控件,添加一个子控件并尝试使用.FindControl方法通过id检索它.

[Test]
    public void TryToFindControl()
    {
        var myPanel = new Panel();
        var textField = new TextBox
        {
            ID = "mycontrol"
        };
        myPanel.Controls.Add(textField);

        var foundControl = myPanel.FindControl("mycontrol");

        // this fails
        Assert.IsNotNull(foundControl);
    }
Run Code Online (Sandbox Code Playgroud)

Win*_*Win 3

Panel尚未添加到Page,因此您无法使用FindControl。相反,您需要在Panel.Controls中找到它

[TestMethod]
public void TryToFindControl()
{
    var myPanel = new Panel();
    var textField = new TextBox
    {
        ID = "mycontrol"
    };
    myPanel.Controls.Add(textField);

    var foundControl = myPanel.Controls
        .OfType<TextBox>()
        .FirstOrDefault(x => x.ID == "mycontrol");

    Assert.IsNotNull(foundControl);
}
Run Code Online (Sandbox Code Playgroud)

使用页面进行测试

仅当容器添加到页面时, FindControl才起作用。

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var myPanel = new Panel();
        var textField = new TextBox
        {
            ID = "mycontrol"
        };
        myPanel.Controls.Add(textField);

        Controls.Add(myPanel);

        // foundControl is not null anymore!
        var foundControl = myPanel.FindControl("mycontrol");
    }
}
Run Code Online (Sandbox Code Playgroud)