示例代码:
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/