编程语言
首页 > 编程语言> > c# – FindControl和动态创建的控件有问题

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

作者:互联网

示例代码:

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

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

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

解决方法:

我可以说,在没有将控件添加到页面的情况下,没有办法完成我想要完成的任务.如果我不得不猜测,我会说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;
    }

标签:c,dynamic,asp-net,web-controls,findcontrol
来源: https://codeday.me/bug/20190526/1158220.html