代码之家  ›  专栏  ›  技术社区  ›  Ash Machine

嵌套用户控件-如何最好地获取对祖先控件的引用

  •  1
  • Ash Machine  · 技术社区  · 16 年前

    我意识到很多代码都不适合这里,但我要求的是一般的方向或指针。

    我试图从嵌套控件获取对祖先控件的引用。

    MyTab _myTab = this.Parent.Parent.Parent.Parent.FindControl(thisTab) as MyTab;
    

    等于 {ASP.controls_appname_widget_mywidget_mytab_ascx} 这是正确的。

    FindControl(“MyWrapper:MyPanel:etc…”),但也不建议这样做,因为结构或ID可能会更改。。。。

    5 回复  |  直到 16 年前
        1
  •  2
  •   Andrew Hare    16 年前

    请记住,最好是使组件不受影响。您永远不希望任何控件拥有层次结构中高于自身的任何知识,也不希望任何控件只拥有层次结构中低于自身的控件的接口知识。从长远来看,这种体系结构方法将为您节省很多痛苦和痛苦,并将避免像您现在这样的情况。

    至于解决当前问题,最好的解决方法是创建一个 MyTab 参考资料-将提供给您。

    ParentTab 并将此属性设置为 我的标签 引用页中的某个位置或控件中的某个位置,该控件对这两个位置都具有可见性 我的标签 还有你的控制。

        2
  •  0
  •   DancesWithBamboo    16 年前

    我认为这真的取决于你对控件的使用。如果控件只服务于一个业务需求,并且只在一个页面上使用以满足用例,那么就没有必要疯狂地使用接口和属性。我看不出parent.parent.parent.etc的想法有什么问题;我自己用过很多次。我会把它包在一个财产里,这样无论什么时候你需要它,你都可以叫这个。MyGreatGreatGrandFatherProperty。它将更具可读性,如果层次结构深度发生变化,您只有一个地方需要修复。

        3
  •  0
  •   Ash Machine    16 年前

    @Andrew,不是要劫持我自己的线程,而是要澄清和讨论一种设计方法。您说过“您永远不希望任何控件在层次结构中拥有任何高于自身的知识……”这是一种很好的设计策略,原因显而易见。但是对于内置了某种集中式管理的包装容器,情况又如何呢?例如,在.NET中,嵌套母版页中的ScriptManager控件。您可能希望脚本管理器只创建一次,并且希望它可用于应用程序中的各种控件。例如,应用程序中任何嵌入式控件中的任何UpdatePanel都希望知道该ScriptManager的存在。这是错误的做法吗?

    我的设计与此类似——最外层的包装容器管理对象持久性,每个控件都可以将其状态保存到该管理器。我现在认为包装代理是最好的设计。因为我不喜欢父母。etc,也不只是为了引用而遍历控件ID。欢迎任何意见。

        4
  •  0
  •   Sunny    14 年前
    public static class Extension{
     public static Control FindControlRecursive(this Control control, string idToFind)
     {
         Control result;
         if(control != null){
            result = control.FindControl(idToFind);
         }
         if(result != null){ return result; }
         if(result == null && control.Parent != null){
             return control.Parent.FindRecursive(idToFind);
         }
         return null;
      }
    }
    
        5
  •  -1
  •   Thomas Hansen    16 年前

    Ra-Ajax 下载

    here

    然后,您可以从Page对象中搜索,它将递归地在委托中查找与您的(无论什么)条件匹配的控件。。。