.NET自定义控件应该如何实现?

开发 后端
这里将介绍如何实现.NET自定义控件,在.NET平台上我们很喜欢从Control来继承,但是笔者不是很赞同,希望本文能对大家有所帮助。
.NET自定义控件有很多人其实不太适应去试用,一般都是从Control来继承,但是如果在工作中积累一定量的.NET自定义控件,对今后的工作是很有帮助的。

自己对C#与.NET的学习并不算深入,只是这段时间要用ASP.NET来做项目,也是出去无奈,只好好的学习了一番,学完后,感觉的确很好,加上Visual Studio的集成开发环境,这个开发的确迅速,而且容易上手,项目很快就要完工了,现在来总结点当时没顾得上总结的东西,决定深入下.NET。

在开发项目的时候,其实我根本就不知道怎么去做.NET自定义控件,有一个复选框级联选择的功能,我用的是ThreeView控件做的,当时并不知道怎么去添加TreeView子节点控件的响应事件,应是用js+dom在客户端添加TreeView生成html元素的事件,很麻烦也费力,也不便维护。

所以这次深入,决定先从.NET自定义控件入手,看了一些资料,关于自定义的控件的。自己想了想如果能够知道.net控件库中的控件类是怎么写的,那不更好的操纵已有的控件和更好地开发自定义控件。到网上找了下,就在博客园上找到了一个C#反编译器Reflector(下载地址http://downloads.red-gate.com/reflector.zip),很好用,能够把.NET库给反编译出来。

从自己的几乎开始,先看控件部分的,按照Vs中工具箱面板中的控件顺序看看,这些控件类的源代码

***个当然是简单的Label类了

  1. Code  
  2. DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ControlValueProperty("Text"), ControlBuilder(typeof(LabelControlBuilder)), DefaultProperty("Text"), ParseChildren(false), Designer("System.Web.UI.Design.WebControls.LabelDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ToolboxData("<{0}:Label runat=\"server\" Text=\"Label\">"), AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]  
  3. public class Label : WebControl, ITextControl  
  4. {  
  5.     // Methods  
  6.     public Label();  
  7.     internal Label(HtmlTextWriterTag tag);  
  8.     protected override void AddAttributesToRender(HtmlTextWriter writer);  
  9.     protected override void AddParsedSubObject(object obj);  
  10.     protected override void LoadViewState(object savedState);  
  11.     protected internal override void RenderContents(HtmlTextWriter writer);  
  12.  
  13.     // Properties  
  14.     [WebCategory("Accessibility"), Themeable(false), IDReferenceProperty, TypeConverter(typeof(AssociatedControlConverter)), DefaultValue(""), WebSysDescription("Label_AssociatedControlID")]  
  15.     public virtual string AssociatedControlID { getset; }  
  16.     internal bool AssociatedControlInControlTree { getset; }  
  17.     internal override bool RequiresLegacyRendering { get; }  
  18.     protected override HtmlTextWriterTag TagKey { get; }  
  19.     [PersistenceMode(PersistenceMode.InnerDefaultProperty), WebCategory("Appearance"), Bindable(true), DefaultValue(""), WebSysDescription("Label_Text"), Localizable(true)]  
  20.     public virtual string Text { getset; }  

Expand Methods

这些是Label内置成员,写过自定义控件的朋友都知道,一般要重载Control类的Render方法,.net库中带的控件类,也不例外,也是要重载这个方法的
Label比较简单,我们托一个页面可以看到其生成html为Label相当简单的,我们可以写这样一个类来模拟Label类

  1. public class MyLabel : Control  
  2. {  
  3.     public MyLabel()  
  4.     { }  
  5.  
  6.     protected override void Render(HtmlTextWriter writer)   
  7.     {  
  8.  
  9.         writer.RenderBeginTag(HtmlTextWriterTag.Span);  
  10.         writer.Write("Label");  
  11.         writer.RenderEndTag();  
  12.  
  13.     }  

在aspx对应的cs文件的load方法中写入如下代码

  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3.     MyLabel ml = new MyLabel();  
  4.     this.form1.Controls.Add(ml);  

我们可以看到结果的html和.net库中的Label(少了id,呵呵)是一样的,当然了,这只是一种,很简单的模仿,如果Label的其他属性设置了,html内容就会变化的
看上门的Label的源码,大家并没有看到Label中重载Render方法是吧,其实这个是在 RenderContents方法中调用了父类WebControl的Rende方法,而WebControl中实现了对Render方法的重载。

看看Label.RenderContents()

  1. Code  
  2. protected internal override void RenderContents(HtmlTextWriter writer)  
  3. {  
  4.     if (base.HasRenderingData())  
  5.     {  
  6.         base.RenderContents(writer);  
  7.     }  
  8.     else  
  9.     {  
  10.         writer.Write(this.Text);  
  11.     }  

而我们自定义控件的时候,经常直接从Control继承,虽然是WebControl性质的,虽然有WebControl,但是很多就是喜欢从Control来继承,不知道为什么,不过我并不怎么赞成。毕竟那样从软件设计上来看就是一种冗余吧,也许WebControl不符合很多朋友们的使用吧。

在Label中AddAttributesToRender方法实现了动态添加属性和显示属性。

我的学习方法就是从表面上知道好东东怎么用之后,就开始深入,了解其运行机制、实现原理,那样就可以很轻松地把整个框架系统的理解下来,可以上下统一,以后做东西可以不管底层的东西,但做起来可以游刃有余。

这里有个HtmlWriterText类,估计有的朋友不知道是干啥子用的,我找了两篇文章,不明白的朋友可以看下
http://msdn.microsoft.com/zh-cn/library/system.web.ui.htmltextwriter(VS.80).aspx
http://www.cnblogs.com/tonyqus/archive/2005/02/15/104576.html

.NET自定义控件应该如何实现就介绍到这里。

本文来自沧桑不尽博客园文章《怎么来自定义控件

【编辑推荐】

  1. C#创建表单简单介绍
  2. C#修改DataReader默认行为
  3. C#设置CooperativeLevel概述
  4. C#表单增加控件简单描述
  5. C# EmployeePlug类概述
责任编辑:彭凡 来源: 博客园
相关推荐

2009-08-06 17:13:56

ASP.NET自定义控

2009-07-28 09:32:41

ASP.NET自定义控

2009-08-10 14:16:59

ASP.NET自定义控

2009-08-06 09:18:01

ASP.NET自定义控ASP.NET控件开发

2009-07-31 10:23:09

ASP.NET源码DateTimePic

2011-04-19 10:33:16

ASP.NET自定义控

2009-06-15 09:50:56

自定义datagridVB Express

2009-06-08 20:13:36

Eclipse自定义控

2013-04-19 10:14:24

2010-08-03 16:13:01

FlexBuilder

2009-08-01 09:21:12

ASP.NET服务器自ASP.NET服务器控ASP.NET

2009-08-06 17:52:45

ASP.NET控件开发自定义控件

2009-09-07 22:00:15

LINQ自定义

2017-02-17 09:37:12

Android自定义控件方法总结

2009-08-05 17:58:53

自定义集合ASP.NET 2.0

2009-08-01 12:00:15

ASP.NET服务器自ASP.NET服务器ASP.NET

2010-01-15 15:26:46

VB.NET自定义类型

2023-01-03 07:40:27

自定义滑块组件

2011-05-19 10:16:27

ASP.NET

2009-08-07 11:12:58

ASP.NET控件开发
点赞
收藏

51CTO技术栈公众号