封装

     在asp.net中,控件被分为两类.用户控件和自定义服务器控件。前者就是我们经常用来将一些可复用的内容封装成的.ascx文件。这里主要研究后者.

创建自定义服务器控件

     创建自定义控件的第一步是选择以哪一个类作为基类来创建控件,Asp.net最常见的几个基类罗列如下:

l System.Web.UI.Control:这是所有控件的基类,所有作为控件的类都必须直接或者间接的继承此类,此类仅仅提供最少量的属性和方法。

l System.Web.UI.WebControls.WebControl:这个类继承于Control类,在实现控件最基本的属性和方法后,又额外提供了控件CSS样式相关的一系列属性。如果是UI控件,那肯定就选它了.

l System.Web.UI.WebControls.Webpart:这个不用说了,看名字就知道是提供了WebPart相关的功能.

l System.Web.UI.WebControls.CompositeControl:如果需要创建复合控件(即那些控件内部还有其他控件,比如Calender),选择这个类作为基类.

l System.Web.UI.WebControls.DatabindingControl:用于作为数据源相关控件的基类。

l System.Web.UI.WebControls.CompositeDatabindingControl:这个基类可以看做上面两个基类的结合,提供了上面两个基类的功能,GridView就是继承自这个基类.

简单控件Or复合控件

     先来了解一下简单控件和复合控件的定义:

简单控件:那些直接生成(render)对应HTML的控件,比如Botton和TextBox控件.

复合控件:如何生成HTML依赖于其子控件,比如Reperater,FormView.

下面的图示会让概念更加清晰:


   简单控件是那些比较简单的更加,往往是一个控件对应一个HTML标签.但缺点显而易见,就是当面对大量HTML代码片段时,就会显得更加难以维护.

复合控件在面对大量HTML代码片段时就显得游刃有余了,在遵守了面向对象抽象和封装的原则上,复合控件的维护性和易用性都不错.

Demo:创建一个简单的服务器控件:

    这里我们创建一个简单的菜单自定义服务器控件。通过继承最基础的System.Web.UI.Control基类。然后覆盖Render方法来达到自定义输出的目的,代码如下:

namespace SimpleControl

{

[ToolboxData("<{0}:menucustomcontrol runat=server></{0}:menucustomcontrol>")]

public class MenuCustomControl : Control

{

protected override void Render(HtmlTextWriter writer)

{

base.Render(writer);

writer.WriteLine("<div>");

RenderMenuItem(writer, "网易", "http://www.163.com");

writer.Write(" | ");

RenderMenuItem(writer, "新浪", "http://www.sina.com");

writer.Write(" | ");

RenderMenuItem(writer, "MSDN", "http://msdn.microsoft.com");

writer.Write(" | ");

RenderMenuItem(writer, "ASP.NET", "http://asp.net");

writer.WriteLine("</div>");

}

private void RenderMenuItem(HtmlTextWriter writer, string title, string url)

{

writer.Write("<span><a href=""");

writer.Write(url);

writer.Write(""">");

writer.Write(title);

writer.WriteLine("</a><span>");

}

}

}

通过HtmlTextWriter类,我们可以在控件原有的基础上,加入我们自己想加入的内容,注意base.Render(writer);方法,通过调用父类的Render方法,我们可以再实现父类的基础上,加入我们额外的内容(很像设计模式里的装饰模式)

控件使用方法:

  Ok,控件完成了.使用方法很简单,只需要在页面头部添加如下代码引入控件即可:

<%@ Register TagPrefix="sc" Namespace="SimpleControl" %>

在使用时就像使用用户控件一样,在页面注册完成后,系统会自动搜索命名空间内的直接或间接继承于Control基类的控件,在前台使用时,会自动出现智能提示:

代码如下:

<sc:MenuCustomControl runat="server"></sc:MenuCustomControl>

页面执行,效果如下:


      Demo2:
继承现有控件

 

        在很多情况下,我们并不需要重新发明轮子,我们可以通过继承来利用现有控件的特性并额外添加我们需要的功能达到复用的目的.先看一下效果:


   通过继承TextBox控件,并添加额外的Enable3d属性,使现有控件拥有额外的属性。前台代码摘录如下:

我是3D的:<sc:TextBox3d runat="server"></sc:TextBox3d><br />

我不是:<sc:TextBox3d runat="server" Enable3D="false"></sc:TextBox3d>

后台代码如下:

[ToolboxData("<{0}:textbox3d runat=server></{0}:textbox3d>")]

public class TextBox3d : TextBox// 继承自TextBox

{

public TextBox3d()

{

Enable3D = true;

}

public bool Enable3D

{

get

{

object enable3D = ViewState["Enable3D"];

if (enable3D == null)

return false;

else

return (bool)enable3D;

}

set

{

ViewState["Enable3D"] = value;

}

}

protected override void Render(HtmlTextWriter output)

{

if (Enable3D)

output.AddStyleAttribute("FILTER", "progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true'");

base.Render(output);

}

}

标签(Attribute)

也许你已经对上面代码的[ToolboxData("<{0}:textbox3d runat=server></{0}:textbox3d>")]感到很迷惑,其实这是C#特有的一种类型。Attribute的本质是一种用于修改其他类的属性或方法的类,其实Attribute本身就是一种类,所有的Attribute都会直接或者间接的继承于System.Attribute,像接口的名称往往以大写的I开头一样,标签的结尾习惯上以Attribute结尾,这样可以增加可读性.简单的示例如下:

public class SampleAttribute : Attribute

{

}

注意,所有的标签(Attribute)都必须被声明为public.

在使用时可以像这样:

public class SampleClass

{

[SampleAttribute]

public virtual void SampleMethod()

{

//...

}

}

在应用的时候,你可以针对一个类,方法或者属性应用好几个Attribute.应用方法可以将这些都写入一个方括号中,就像这样:

[DefaultProperty("Text"), toolboxdata("<{0}:mylabel runat=server></{0}:mylabel>")]

也可以分别写在几个不同的方括号中,就像这样:

[DefaultProperty("Text")]

[ToolboxData("<{0}:mylabel runat=server></{0}:mylabel>")]

Visual Studio控件开发常用的标签(Attribute)

在利用Visual Studio进行控件开发时,利用Attribute特性可以让空间更加智能,比如当你双击控件时,默认会进入控件的哪个事件的EventHandler,或者当你从ToolBox里拽过来你开发的控件,默认在前台会生成什么样的代码片段等.这些都可以利用Attribute做到.这些常用的属性都被定义在System.ComponentModel命名空间中,下面是这个命名空间里的常用的Attribute.

Attribute

描述

BindableAttribute

Indicates whether or not a property supports two-way

data binding

BrowsableAttribute

Indicates whether or not a property or event should be listed in a property browser

DefaultEvent

Specifies the name of the default event for a class

DescriptionAttribute

Allows the property browser to display a brief description of a property

ToolboxData

Specifies default values for control attributes and customizes the initial HTML content

EditorAttribute

Associates a UI type editor with a property

DefaultProperty

Specifies the name of the default property for a class

转载于:https://www.cnblogs.com/CareySon/archive/2009/10/02/1577402.html

Asp.net控件开发学习笔记(三)-控件开发基础相关推荐

  1. Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作

    Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作 移动/交换对象的顺序 移动对象的顺序 TREEVIEW FEATURE MOVE ( 1,2 ) 将索引号为1和2的特征交换位置 T ...

  2. Python-web开发学习笔记(1)--- HTML基础

    大家好,我是尚拙谨言,欢迎来到本专栏.本专栏主要是为web开发学习服务的,一共分为3个部分:前端介绍.数据库.Django,均为python web开发的学习笔记,希望能帮助到大家,也以此作为我个人的 ...

  3. IOS开发学习笔记018- 一般控件的使用

    1.移动 2.动画 3.缩放 3.旋转 4.简化代码 5.总结 UIButton 的两种状态 normal highlighted  1.移动 OC语法规定:不允许直接修改某个对象中结构体属性的成员. ...

  4. 移动Web开发--学习笔记三 响应式项目实战(微金所)

    响应式项目实战(微金所) 响应式项目开发流程 选择一种屏幕格式进行开发 相应功能模块完成后,测试是否响应式效果 确保响应式效果满足要求 进行下一个功能模块开发 使用自定义字体图标 创建自己的字体图标h ...

  5. android游戏开发学习笔记三(学习书籍 Android游戏编程之从零开始)

    /**  * 画笔  *   * @author 岳振华  *   */ @SuppressWarnings("unused") public class PaintSruface ...

  6. cad二次开发 java_基于.NET的CAD二次开发学习笔记一:CAD开发入门

    1.AutoCAD .NET API由不同的DLL文件组成,它们提供用于访问图形文件或AutoCAD应用程序的包含丰富的类.结构.方法和事件.每一个DLL文件都定义不同的使用基于功能的库组织组件的命名 ...

  7. java学习笔记(三):前端miniUI控件库入门

    java学习笔记(三):前端miniUI控件库入门 最近在一家公司实习学习,一上来就需要学习了解相关的前端内容--miniUI.而这个内容自己本身并没有了解学习过,上手也是遇到了不少的问题,于是想把自 ...

  8. Windows驱动开发学习笔记(三)—— 内核空间内核模块

    Windows驱动开发学习笔记(三)-- 内核空间&内核模块 内核空间 实验 第一步:编译如下代码 第二步:将 .sys 文件拷贝到虚拟机中 第三步:部署 .sys 文件并运行 第四步:创建一 ...

  9. Kinect开发学习笔记之(三)Kinect开发环境配置

    Kinect开发学习笔记之(三)Kinect开发环境配置 zouxy09@qq.com http://blog.csdn.net/zouxy09 我的Kinect开发平台是: Win7 x86 + V ...

最新文章

  1. PTA 基础编程题目集 7-11 分段计算居民水费 C语言
  2. javascript之值传递与引用传递
  3. java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \ ^
  4. 性能更好的js动画实现方式——requestAnimationFrame
  5. [pasecactf_2019]tornado_casino
  6. windows时间显示到秒
  7. C++模拟实现Objective-C协议和代理模式
  8. 一个Setup Factory的Lua脚本
  9. Redis 缓存实战——缓存、数据库一致性问题分析与解决方案
  10. 用c#语言制作ktv点歌系统,KTV点歌系统的设计与实现的设计和实现(C#,C/S,Access)
  11. mt950报文解析_MT700报文升级的内容分析及对信用证实务操作的影响
  12. matlab编译平面有限元计算(附有完整代码)
  13. 华为mt2c00 android7.0,mate9安卓7.0哪个版本最好用
  14. 计算机专业wor知识,计算机专业毕业实习日记精选
  15. 域渗透-横向移动(PTH)
  16. docker 容器健康检查
  17. 线上Request method ‘GET‘ not supported 问题
  18. 蝌蚪在线匿名聊天室HTML源码
  19. 基础30讲 第18讲 三重积分、曲线曲面积分
  20. 医院排队叫号系统(JAVA版)

热门文章

  1. 【Kaggle Learn】Python 1-4
  2. 2022-2028年中国钢筘行业市场研究及前瞻分析报告
  3. Go 学习笔记(77)— Go 第三方库之 cronexpr(解析 crontab 表达式,定时任务)
  4. 【Design pattern】设计模式思路总结(三)
  5. MindInsight计算图可视设计
  6. 如何在TVM上集成Codegen(上)
  7. TVM部署和集成Deploy and Integration
  8. NSight Compute 用户手册(中)
  9. SLAM架构的两篇顶会论文解析
  10. YOLOV4知识点分析(一)