FindControl和动态创建的控件有问题

Fis*_*ter 4 c# asp.net dynamic findcontrol web-controls

示例代码:

    var div = new HtmlGenericControl("div");
    div.Controls.Add(new Literal() { ID = "litSomeLit" });
    var lit = (Literal)div.FindControl("litSomeLit");
    Assert.IsNotNull(lit);
Run Code Online (Sandbox Code Playgroud)

此代码未通过断言,因为lit为null.调试显示div.Controls肯定包含ID为"litSomeLit"的文字.我的问题是"为什么?" 并且"有没有办法获得对特定ID的控制,而不是一次手动一个元素递归搜索div.Controls []?"

我这样做的原因是我的实际应用并不那么简单 - 我正在编写的方法给出了一个复杂的控件,在许多可能的配置中有几个子控件.我需要访问几个层的特定控件(例如,具有ID"txtSpecificControl"的控件可能在StartingControl.Controls[0].Controls[2].Controls[1].Controls[3]).通常我可以这样做FindControl("txtSpecificControl"),但是当控件刚刚动态创建时(例如上面的示例代码中),这似乎不起作用.

Fis*_*ter 5

我可以说,在没有将控件添加到页面的情况下,没有办法完成我想要完成的任务.如果我不得不猜测,我会说FindControl使用控件的UniqueID属性,该属性通常包含当前控件上方所有控件的ID(例如OuterControlID $ LowerControlId $ TargetControlID).只有在控件实际添加到页面时才会生成.

无论如何,这是一个递归深度优先搜索FindControl的实现,当控件没有附加到页面时它将起作用:

    public static Control FindControl(Control parent, string id)
    {
        foreach (Control control in parent.Controls)
        {
            if (control.ID == id)
            {
                return control;
            }
            var childResult = FindControl(control, id);
            if (childResult != null)
            {
                return childResult;
            }
        }
        return null;
    }
Run Code Online (Sandbox Code Playgroud)