在调试问题时,我正在一个DetailsView上找到一个模板中的控件我遇到了一些奇怪的问题。我已经实现了一个递归的FindControl扩展,它找到一个id与我搜索的id完全不同的控件。实现基本上是在父控件上调用Findcontrol,然后如果找不到任何内容,则调用子控件上的递归函数。
我开始用反射器挖掘asp.net代码,并找出如何实现一个复选框FindControl方法所在的位置(System.Web.UI.WebControls.CheckBoxList中的那个)
protected override Control FindControl(string id, int pathOffset)
{
return this;
}
现在这一切都有道理,为什么我的FindControl找到了一个CheckBoxList,但是我可以看到这个实现背后没有任何理由,任何人都可以启发我吗?
答案 0 :(得分:2)
FindControl的这个实现覆盖了一个递归方法。
protected override Control FindControl(string id, int pathOffset)
{
return this;
}
重写:
protected virtual Control FindControl(string id, int pathOffset)
{
string str;
this.EnsureChildControls();
if (!this.flags[0x80])
{
Control namingContainer = this.NamingContainer;
if (namingContainer != null)
{
return namingContainer.FindControl(id, pathOffset);
}
我推测它将在不需要递归方法时使用IE已知当前控件是您正在寻找的控件。
额外的阅读 MSDNControl.FindControl在当前命名容器中搜索服务器 具有指定id和整数的控件,在。中指定 pathOffset参数,有助于搜索。你不应该 覆盖此版本的FindControl方法。
<强> ID 强>
要找到的控件的标识符。
<强> pathOffset 强>
到达命名容器所需的页面控制层次结构的控件数。