实现FindControl的正确方法是什么

时间:2014-02-25 10:38:36

标签: asp.net webforms telerik

提前抱歉,这个问题很长。

由于我遇到了StackOverflow异常(具有讽刺意味),我知道其原因,我真的想知道我是否有我的概念,如何正确实现FindControl。

我的想法是,如果您正在实现FindControl应该可以访问的自定义子控件集合,除了调用基本方法之外,您还必须实现FindControl并搜索列表。

现在情况就是这样: 我写了一个服务器控件,它有一个templateproperty(我在init上添加)。我们现在称之为“面板”(它不是默认的asp)

我的结构与此相符:

panel (1)
 panel (2)
  telerik:RadTabStrip
 panel (3)
  telerik:RadMultiPage

现在我的更改之前发现控件工作正常,但是如果radTabStrip会通过其id查找多页,那么它将开始查看2,它显然无法找到其他多页,因为它不是2岁的直接孩子。

我的更改是转到NamingContainer(导致3)并循环遍历子控件并在那里执行FindControl。这最初有助于解决这个问题。

然而,在有3个孩子的结构中,所需的控制是第三种,这种搜索方式会导致在第一和第二个面板之间来回跳舞。所以这是一个触发StackOverflowException的兄弟搜索,这是有意义的。

然而显然,如果我实际上并没有在那里做一些非常错误的事情,这就为我提出了问题。其他控件似乎没有任何麻烦查看NamingContainers的层次结构。

是否有一些ID名称寄存器(例如,命名容器中的所有控件都注册了它们包含的id,而在findcontrol中你只需要去一些查找类来找到你想要的控件而无需任何自定义逻辑来浏览控件并调用FindControl )我不知道,或类似的东西?

我真的希望你能帮我这个。

我知道如何解决这个问题的问题,但我很想知道如何以正确的方式实现这一点。

1 个答案:

答案 0 :(得分:1)

每个Control都有自己的Controls集合,即“内置” - 您不需要'命名寄存器'。

你基本上需要一个递归函数: 例如,写MyFindControl,以便它接受Control-Collection作为参数。 让你的函数遍历那个集合,如果你找到你正在寻找的控件(通过名字?),那就返回它。

如果您当前正在检查的控件不是您正在查找的控件,请让您的函数再次调用自身,将该控件的控件集合作为参数。

如果正在搜索的控件没有出现,您可以返回NothingNull(取决于您的语言),或者您可以引发错误。使用自定义FindControl实现的代码必须处理它。