Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FindControl和动态创建的控件出现问题_C#_Asp.net_Web Controls_Dynamic_Findcontrol - Fatal编程技术网

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

C# FindControl和动态创建的控件出现问题,c#,asp.net,web-controls,dynamic,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为null。调试表明div.Controls肯定包含ID为“litSomeLit”的文本

示例代码:

    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()在此上下文中可能不起作用

调试测试时,var
是否亮起
null?如果是这样,您可能必须按项索引访问成员,而不是使用FindControl()方法。

将代码更改为

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

据我所知,FindControl仅在控件位于页面的可视树中时才起作用。

据我所知,如果不将控件添加到页面中,就无法完成我试图完成的任务。如果非猜不可,我会说FindControl使用控件的UniqueID属性,该属性通常包含当前控件之上所有控件的ID(例如OuterControl$LowerControl$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;
    }

A) 是,通过检查控件的控件集合。但是,以下测试通过得很好:这意味着FindControl应该能够找到它。B) 呃,是的。这就是问题的关键所在-为什么它是空的,和/或我如何绕过这个事实,而不必按项索引检查和访问所有内容(这会很乏味,因为我不知道我的目标控件到底有多深,在什么索引处)?我无法进行更改,因为我的方法不知道控件应该添加到页面中的什么位置。我可以将控件添加到页面中,运行FindControl,然后将其从页面中删除,但这似乎比手动执行递归搜索更为粗糙。我不明白您需要执行FindControl。因为您正在创建文字y,所以在将变量添加到页面之前,您不能保留该变量,然后使用page.FindControl再次获取该控件。