FindControl实现

时间:2009-03-05 09:16:02

标签: c# asp.net

在调试问题时,我正在一个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,但是我可以看到这个实现背后没有任何理由,任何人都可以启发我吗?

1 个答案:

答案 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已知当前控件是您正在寻找的控件。

额外的阅读 MSDN

  

Control.FindControl在当前命名容器中搜索服务器   具有指定id和整数的控件,在。中指定   pathOffset参数,有助于搜索。你不应该   覆盖此版本的FindControl方法。

<强> ID
    要找到的控件的标识符。

<强> pathOffset
    到达命名容器所需的页面控制层次结构的控件数。

link