转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
ASP.NET组件设计Step by Step(8)         ★★★★

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1376 更新时间:2009/4/23 10:41:34

控制控件的样式

 

控件最终通常要生成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。

 

复合可以重用,但是也会带来性能损失(例如子控件实例化等)。所以,需要在性能和易用之间权衡,要么复合控件,要么干脆自己编写完全生成控件。

 

复合控件视图状态如何工作?

Control内建了跟踪、保存和恢复子控件的状态。

在开始跟踪视图状态阶段中,Control依次调用Controls集合中的控件的TrackVierState方法,跟踪子控件的状态。如果子控件是在父控件中打开状态下加入到Controls中,那么在添加到集合时候调用TrackViewState方法。

在保存视图状态阶段,Control首先调用SaveViewSate方法,默认情况下首先调用ViewState字典的SaveViewState。并保存所返回的对象,作为控件视图的第一部分;接下来,Control调用每一个子控件的SaveViewState,如果返回的子控件不为空,那么由Control在两个ArrayList中保存子控件的编号和对应状态,用来进行串行化。

在加载视图状态阶段,control先调用LoadViewState方法恢复上一次保存的状态第一部分,接下来Control访问Controls集合,将剩下的状态加载入子控件,一般通过编号和保存状态的ArrayList来组成,这样就恢复了控件及其子控件的转台。如果在此阶段还没有创建子控件,那么先保存子控件状态,留做以后使用,直到子控件创建后加载给子控件。

 

事件冒泡

ASP.NET 页框架提供一种称为“事件冒泡”的技术,允许子控件将事件沿其包容层次结构向上传播。事件冒泡允许在控件层次结构中更方便的位置引发事件,并且允许将事件处理程序附加到原始控件以及公开冒泡的事件的控件上。

例如:数据绑定控件(Repeater、DataList 和 DataGrid)使用事件冒泡将子控件(在项目模板内)引发的命令事件公开为顶级事件。虽然 .NET 框架中的 ASP.NET 服务器控件将事件冒泡用于命令事件(事件数据类是从 CommandEventArgs 派生的事件),但是,服务器控件上定义的任何事件都可以冒泡。

控件可以通过从基类 System.Web.UI.Control 继承的两个方法参与事件冒泡。这两个方法是:OnBubbleEvent 和 RaiseBubbleEvent。以下代码片段显示了这些方法的签名。

protected virtual bool OnBubbleEvent(

   object source,

   EventArgs args

);

protected void RaiseBubbleEvent(

   object source,

   EventArgs args

);

RaiseBubbleEvent 的实现是由 Control 提供的,并且不能被重写。RaiseBubbleEvent 沿层次结构向上将事件数据发送到控件的父级。若要处理或引发冒泡的事件,控件必须重写 OnBubbleEvent 方法。

 

使事件冒泡的控件执行以下三种操作之一。

1、控件不执行任何操作,此时事件自动向上冒泡到其父级。

2、控件进行一些处理并继续使事件冒泡。若要实现这一点,控件必须重写 OnBubbleEvent,并从 OnBubbleEvent 调用 RaiseBubbleEvent。以下代码片段(摘自模板化数据绑定控件示例)在检查事件参数的类型后使事件冒泡。

protected override bool OnBubbleEvent(object source, EventArgs e) {

            if (e  is CommandEventArgs) {               

[1] [2]  下一页


[C语言系列]NET 中C#的switch语句的语法  [系统软件]托拽Explore中的文件到VB.net的窗口
[系统软件]Boost库在XP+Visual C++.net中的安装  [系统软件]交叉编译sshd for IXP425 ARM  Platform by MVL 3…
[常用软件]新配色面板:Paint.Net3.0RC1官方下载  [常用软件]用内建的“Net Meeting”聊天
[VB.NET程序]Henry的VB.NET之旅(三)—共享成员  [VB.NET程序]Henry的VB.NET之旅(二)—构造与析构
[VB.NET程序]Henry的VB.NET之旅(一)—失踪的窗体  [VB.NET程序]在托盘上显示Balloon Tooltip(VB.NET)
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台