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

ASP.NET
asp.net GridView控件中模板列CheckBox全选、反选、取消
asp.net GridView 删除时弹出确认对话框(包括内容提示)
asp.net DropDownList 三级联动下拉菜单实现代码
asp DataTable添加列和行的三种方法
Asp.net 页面调用javascript变量的值
asp.net 长文章通过设定的行数分页
asp.net 定时间点执行任务的简易解决办法
asp.net 页面延时五秒,跳转到另外的页面
asp.net 动态输出透明gif图片
asp.net DataList与Repeater用法区别
asp.net Javascript获取CheckBoxList的value
asp.net程序在调式和发布之间图片路径问题的解决方法
asp.net下生成英文字符数字验证码的代码
asp.net 页面版文本框智能提示JSCode (升级版)
ASP.NET URL伪静态重写实现方法
ASP.NET 2.0 中Forms安全认证
asp.net 动态添加多个用户控件
asp.net Repeater显示父子表数据,无闪烁
asp.net 无法获取的内部内容,因为该内容不是文本 的解决方法
asp.net GridView排序简单实现

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 36 ::
收藏到网摘: 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 服务器控件将事