技术开发 频道

.net控件开发之复合控件:概念基础篇


    CompositeControl类是一个抽象类,为自定义控件提供命名容器和控件设计器功能,该自定义包含全部子控件或使用其他控件功能。

    此类实现了INamingContainer接口,该接口没有任何方法,为什么要继承此接口呢?

    答案是:它会使页面在控件下创建一个新的命保范围,当实现该接口时,控件包含的任何子控件的表示符,保证页面中确定是唯一的。例如,如果页面上有两个gridview控件,第一个gridview的子控件和第二个gridview子控件会有不同的唯一标表示符。

    事例:就如我们团队有一个团队号(001)[复合控件ID],个人标识(suiqi)[指子控件ID],当我们在团队的标识通常为001-suiqi

    开发复合控件不得不去说说两个方法,一个是CreateChildControls方法,一个是EnsureChildControls方法。

    先说一下CreateChildControls方法:CreateChildControls方法来对子控件进行实例化、初始化、并把这些子控件添加到控件树中.

    但一定不能在构造器或OnInit方法中执行该逻辑. 必须在CreateChildControls方法中创建子控件,而不是在诸如实例化或初始化这样的特定阶段创建,这样可以在控件生命周期中任何需要的时候来创建子控件.当创建一个复合控件且由其子控件来处理回传数据时,这样做特别重要.

    再详解一下EnsureChildControls方法。该方法为了确保子控件在代码访问它们之前创建好了,该方法来创建军子控件,控件实现中的任何需要访问子控件代码必须先调用EnsureChildControls方法,例如,页面用来定位子控件的FindControl方法的默认实现,就先调用了EnsureChildControls方法.注意,如果子控件没有在控件生命周期中的预先成阶段之前被创建,那么它们会在这个时候根据要求创建.这是因为在PreRender方法的默认实现中调用了所有其Visible属性值为true的控件的EnsureChildcontrols方法。 

   我们知道它的作用,但还要了解为什么,什么时候调用EnsureChildControls的。

    什么时候被调用:在PreRender过程中页面会自动调用EnsureChildControls,这个方法就会自动调用CreateChildControls方法重新建立控件内容。

0