当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET立即上手教程(14)

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

ASP.NET立即上手教程(14)


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

创作自定义服务器控件

本章的内容演示高级开发者如何书写ASP.NET页面中的服务器控件。通过书写自定义的服务器控件,可以封装定制的用户接口以及其他功能。本教程通过一系列逐渐展开的例子提供了创作自定义控件的入门知识。关于控件创作的更多信息,参阅.NET Framework SDK文档中“开发ASP.NET服务器控件”部分。

重要提示:本章表述的控件尽管可以在ASP.NET页面的运行时刻正常运行,但是在页面开发工具,如Microsoft Visual Studio.NET,设计时却有可能无法正常工作。为了在设计器中正常工作,自定义控件需要应用设计时刻属性----该属性在本章不进行表述。关于设计时刻属性的细节,参阅SDK文档中“组件的设计时刻属性”部分。

开发一个简单的自定义控件

开始创作自己的ASP.NET服务器控件其实很容易。要想建立一个自定义控件,你需要做的全部工作仅仅是定义一个从System.Web.UI.Control继承而来得类,并且覆盖它的Render方法。Render方法带有一个System.Web.UI.HtmlTextWriter类型的参数。控件需要发送到客户端的HTML代码作为字符串参数传递给HtmlTextWriter的Write方法。

定义简单的属性

属性类似于“聪明”的字段,它具有存取器方法。你可能从你的控件中expose属性而不是公共字段,因为属性允许数据隐藏,可以版本控制,并且可以被可视化设计工具所支持。属性具有get/set存取器方法,用来设置和取得属性值,并允许在必要的时候执行额外的程序逻辑。

下面的例子展示如何增加简单的属性,它对应私有数据类型,如整数、布尔和字符串。这个例子定义了三个属性:Message是字符串类型、MessageSize是枚举类型、Iterations是整数类型的。请注意设置简单属性和枚举属性的ASP.NET页面语法。

定义类属性

如果类A的属性类型是类B,那么B的属性被称为A的子属性。下面的例子定义了一个自定义服务器控件SimpleSubProperty,它有一个Format类型的属性。Format是一个具有两个私有属性的类:Color和Size ,他们依次成为了SimpleSubProperty的子属性

注意ASP.NET具有特定的语法来设定子属性。下面的代码显示了如何显式设置SimpleSubProperty的子属性Format.Color和Format.Size。“-”语法表示子属性。

<SimpleControlSamples:SimpleSubProperty Message="Hello There" Format-Color="red" Format-Size="3" runat=server/>

找回内部的内容

每个控件都有一个从System.Web.UI.Control继承的Controls属性。这是一个集合属性,表示控件的子控件。如果一个控件没有用ParseChildrenAttribute或者ParseChildrenAttribute(ChildrenAsProperties = false)标识,那么当控件在页面中声明的时候,ASP.NET页面框架就会应用下面的解析逻辑。如果解析器在控件的标签中遇到嵌套控件,它就会建立控件实例,并将其添加到控件的Controls属性。标签间的文字文本被添加为LiteralControl。任何其他嵌套元素产生一个解析错误。

下面的例子展示了一个自定义控件SimpleInnerContent,通过检查LiteralControl是否被添加到它的控件集合中,来决定是否将交付的文本增加到它的标签之间。如果是,它就取得LiteralControl的Text属性,然后将其添加到输出字符串。

重要提示:如果你的自定义控件从WebControl衍生而来,它将不会有上面例子中描述的解析逻辑,因为WebControl用ParseChildrenAttribute(ChildrenAsProperties = true)标记,它导致不同的解析逻辑。关于ParseChildrenAttribute的更多信息,请参阅.NET Framework SDK文档。

开发复合控件

你可以使用类的合成,通过组合现在有的控件来创作新的控件。复合控件类似于用户控件,也是使用ASP.NET语法来创建。用户控件和复合控件的主要区别是:用户控件是扩展名为.ascx的文本文件,而组合控件是编译过的,已汇编的方式使用。

开发组合控件的关键步骤是:

· 覆盖从Control继承的保护型方法CreateChildControls,建立子控件的实例,并将其添加到控件集合。

· 如果页面中的复合控件实例需要重复创建,需要引入System.Web.UI.INamingContainer接口。这是一个没有方法的标签接口。当他被控件引入的时候,ASP.NET将在这个控件下面建立一个新的名称空间。这就保证了子控件在控件的继承树中具有唯一的ID。

你不必覆盖Render方法,因为子控件提供了交付逻辑。你可以引申子控件合成的属性。

下面的例子定义了一个复合控件Composition1,它合并了System.Web.UI.LiteralControl和System.Web.UIWebControls.TextBox.Composition1,引申了一个整数类型的自定义属性Value,映射TextBox到的Text属性。