【问题标题】:What's the proper way to implement FindControl实现 FindControl 的正确方法是什么
【发布时间】:2014-02-25 10:38:35
【问题描述】:

抱歉,问题太长了。

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

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

所以现在的情况是这样的: 我写了一个服务器控件,它有一个模板属性(我在 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 ) 我不知道,还是类似的?

我真的希望你能帮我解决这个问题。

我知道如何解决我的问题,但我很想知道如何以正确的方式实际执行此操作。

【问题讨论】:

    标签: asp.net webforms telerik


    【解决方案1】:

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

    你基本上需要一个递归函数: 例如,编写 MyFindControl 以便它接受 Control-Collection 作为参数。 让您的函数遍历该集合,如果找到要查找的控件(按名称?),则返回它。

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

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

    【讨论】:

    • 这并不能解决蜜蜂无法在父/兄弟层次结构中找到控件的问题。通过孩子递归不是我遇到问题的情况 - 这将是相当容易和通用的修复。
    • 你可以写一个像GetParent这样的辅助方法,它一直到最高的实例(例如,母版页),然后用上面的方法遍历控件(是的,非常基本和通用)方法。
    • 所以你说的是问题是我正在为 FindControl 实现其他控件,这反过来又导致无限递归。我确信这会起作用,但它似乎需要大量的控件遍历,并且只适用于由 Controls 属性公开的控件。 FindControl 通常提供搜索控件属性未公开的控件。这就是为什么我这样做,以及为什么它不适合我。
    • 也许有一种完全不同的方法。为什么你需要在那种情况下找到一个控件?
    • 在我显示面板 (2) 的标记中包含一个标签条。单击该按钮后,它将返回服务器并尝试通过在其命名容器上使用 FindControl 在多页内部面板 (3) 中查找页面视图。由于正在使用返回以启动搜索面板 (2) 的命名容器,并且找到它所需的路径将转到面板 (1),因此在此处调用 FindControl 以到达面板 (3)。但是,由于面板浏览其子控件,最终将无限递归。 (我已经解决了这个问题。但我相信一定有更好的方法)
    猜你喜欢
    • 2011-11-06
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2011-02-23
    • 2011-05-04
    • 2014-04-07
    • 1970-01-01
    相关资源
    最近更新 更多