当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET组件设计Step by Step(8)

ASP.NET
asp.net Execl的添加,更新操作实现代码
asp.net 生成曲线图实现代码
从外部的js文件中获取ASPX页面的控件ClientID
asp.net 因为数据库正在使用的解决方法
asp.net Repeater 自递增
asp.net 实现防迅雷等下载工具盗链
ASP.NET封装的SQL数据库访问类
asp.net 通过指定IP地址得到当前的网络上的主机的域名
aspx 服务器架设问题解决
ASP.NET Session使用详解
Asp.net 5种页面转向方法
ASP.NET 用户多次登录的解决方法
ASP.NET下母版页和内容页中的事件发生顺序整理
asp.net 程序性能优化的七个方面 (c#(或vb.net)程序改进)
从客户端检测到有潜在危险的Request.Form值的asp.net代码
asp.net CommunityServer中的wwwStatus
在应用程序级别之外使用注册为allowDefinition=''MachineToApplication''的节是错误的
.net开发人员常犯的错误分析小结
ASP.net Substitution 页面缓存而部分不缓存的实现方法
asp.net 生成静态时的过滤viewstate的实现方法

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 187 ::
收藏到网摘: n/a

控制控件的样式 控件最终通常要生成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、 覆盖受保护的虚函数CreateControlStyle2、 利用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 服务器控件将事