ASP教程 PHP教程 JSP教程 CGI教程 XML教程
  • ASP.NET教程
  • JAVA教程
    当前位置:教程 > 程序设计 > ASP.NET教程 > 正文

    ASP.NET组件设计Step by Step(8)

    编辑:教程网 来源:网络 时间:2011年11月07日 15:49
    控制控件的样式



    控件最终通常要生成HTML代码在客户端,这些HTML元素可以采用丰富的CSS样式。你当然可以直接进行CSS 设定,但是ASP.net给控件开发者提供了编程方式控制样式的途径。

    如果对样式无特殊要求,直接继承webControl的样式功能即可,如果需要修改或者扩充继承的样式功能,则需要深入了解控件样式的背景知识

    WebControl的样式功能全部封装在ControlStyle属性中(一个名为Style System.Web.UI.WebControls.Style的属性)。所有样式属性都是ControlStyle属性的子属性。WebControl的ControlStyle的定义为:

    Private Style _contentStyle;

    ……

    public Style ControlStyle

    {

    get

    {

    if(_contentStyle = = null)

    {

    _contentStyle=CreateControlStyle();

    if(IsTrackingViewState)

    {

    ((IStateManager)_controlStyle).TrackViewState();

    }

    }

    return _contentStyle;

    }

    }

    我们看到,ControlStyle是只读属性,在第一次访问时被创建(这个思想继承了.net的JIT方案)。

    那么这个CreateControlStyle到底是什么回事?

    Protected virtual Style CreateControlStyle()

    {

    return new Style(ViewSatte);

    }

    原来也是读取ViewState得到的。这样,无论是你从.aspx页面中关于控件声明中定义的还是通过编程设定的都可以在存取时反映得到。

    作为控件开发者,可以自定义继承自Style的属性,例如,MyTable控件定义一个TableControl类型,添加Table支持的cellpadding\CellSpaceing等属性。

    编程控制属性有3种途径:

    1、 覆盖受保护的虚函数CreateControlStyle

    2、 利用ApplyStyle(Style s)方法将自定义的属性复制到控件自己的ControlStyle中去

    3、 MergeStyle(Style s)合并方法到ControlStyle中去



    我们看到,控件的ControlStyle属性和其他子属性都是公用一个StateBag的。因为控件style生成时候是调用传递ViewState的构造函数。另外,子控件也是采用同一个StateeBag来存储状态的。





    复合控件

    首先明确复合控件不同于用户控件,因为它是编译后的形式出现的,而用户控件则以文本形式部署。但共同点都是类复用来复用他们的功能。

    复合控件包含多个已存控件,复用子控件提供的功能。譬如,当要编写的复合控件包含TextBox时候,就不必自己实现IPostBackDataHandler接口。复合控件可以派生子Control类或者WebControl类,复合的要点是:

    1、 重载CreateChildControl方法来对子控件进行实例化、初始化,并将子控件添加到控件树中(加入到page的控件树从而获得控件的生命周期)。需要避免的是不可在OnInit事件中执行业务逻辑。

    2、 实现System..Web.UI.InamingContainer接口,从而在复合控件下建立一个新的命名范围。InamingContainer仅仅是一个标记接口,让框架自动实现子控件的唯一命名。

    为什么必须在CreateChildControls方法中创建子控件呢?实际上,这样做是为了可以在控件生命周期中任何需要的时候来创建子控件,而且可以利用子控件来处理诸如会传数据等任务。为了确保子控件在代码访问其之前创建好,Controllei定义的EnsureChildControls保护方法来检查子控件是够已经创建好,如果没有创建,,就可以调用CreateChildControls方法来创建。如果子控件没有在render之前被创建,那么缺省情况下visible为true的未被创建的子控件会被PreRender方法的默认实现调用EnsureChildControls。
  • 原文来自 教程网 转载请注明:http://www.websmill.com/chengxu/aspnet/31767.html

  • 上一篇:UML类图
  • 下一篇:Dotnet总结(1)