c# - FindControl 和动态创建的控件出现问题

标签 c# asp.net web-controls dynamic findcontrol

示例代码:

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

此代码断言失败,因为 lit 为空。调试显示 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# - FindControl 和动态创建的控件出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3559760/

相关文章:

javascript - 自动滚动到 Gridview asp.net 中最后插入的行

javascript - 如何在脚本中禁用 RequiredFieldValidator

asp.net - 在 asp.net 中动态更改 css 属性的值

c# - 将隐藏对象从 View 传递到 Controller

c# - C# 编译器是免费的吗?

c# - 动态单选按钮将添加的列表项设置为选中

c# - 如何在 ASP.NET 中通过 C# 从数据库中的列获取平均值?

c# - ASP.Net 中的图形 (c#)

Android 如何观察 Opera 和 Dolphin 浏览器或所有浏览器

c# - 显示页面时如何触发命令