ASP.NET控件设计时支持浅析

开发 后端
ASP.NET控件设计时支持是什么呢?ASP.NET控件设计时支持是人们喜欢.NET的原因之一,那么本文就向你简单介绍ASP.NET控件设计时支持的内容。

ASP.NET控件设计时支持是什么呢?大家好象对控件设计时的讨论不多,是不是感觉功能实现就可以了,当然设计时支持是可有可无的.我敢说没有设计时支持的话,可能很多人不喜欢.net,正因为有设计时支持,更降低了.net学习的门槛.这次就简单的来看看,如果简单的实现你常用的几个功能.

ASP.NET控件设计时支持一.ControlDesigner类

ControlDesigner作为web服务器控件的设计器的基类,你可以扩展此类. 总之你了解这个类以后你会发现原来你平时看到的控件能够在VS2005设计时中完美的呈现也是微软帮你做的.既然如此,作为一个完美的控件也应该配有设计时的支持,有时候可以让开发达到事半功倍的效果.这里先不介绍这个类其中具体的方法和属性了.我们接了会具体使用的.

ASP.NET控件设计时支持二.获取设计时关联控件HTML

(1) 定义控件

让我们来定义两个最简单的控件

  1. public class DesginControl : Control  
  2.   {  
  3.  
  4.       public string Text  
  5.       {  
  6.           get 
  7.           {  
  8.               String s = (String)ViewState["Text"];  
  9.               return ((s == null) ? String.Empty : s);  
  10.           }  
  11.  
  12.           set 
  13.           {  
  14.               ViewState["Text"] = value;  
  15.           }  
  16.       }  
  17.       protected override void Render(HtmlTextWriter writer)  
  18.       {  
  19.           writer.Write(Text);  
  20.       }  
  21.   }  
  22.  
  23.   public class DesginWebControl :WebControl  
  24.   {  
  25.       public string Text  
  26.       {  
  27.           get 
  28.           {  
  29.               String s = (String)ViewState["Text"];  
  30.               return ((s == null) ? String.Empty : s);  
  31.           }  
  32.  
  33.           set 
  34.           {  
  35.               ViewState["Text"] = value;  
  36.           }  
  37.       }  
  38.       protected override void RenderContents(HtmlTextWriter writer)  
  39.       {  
  40.           writer.Write(Text);  
  41.       }  
  42.   } 

(2)第一次测试

好了,两个控件一个派生自Control,一个派生于WebControl,编译后把他们一起拖到设计器上吧,看看效果

WebControl 

DesignControl在Text属性为空的时候,即没有呈现任何内容的时候,设计器上会出现上面这样的文字

DesignWebControl更离谱,看到DesignWebControl文字右边的小方框了没,这个就是其默认呈现的效果.

(2)第二次测试

下面再次给他们两加上Text属性后的效果,再看效果

加上Text属性 

DesignControl显示效果很好,

DesignWebControl也可以达到跟DesignControl一样的效果,但多了项功能.

其可以允许在设计器中自动的拖拉控件改变控件的宽度和高度,看到右下脚的鼠标和控件中间控件的115和42没.很不幸DesignControl没有这样的功能.为什么呢?

(4)第三次测试

我们再来最后的一次测试.我们再次将Text属性的内容去掉

效果如下

将Text属性的内容去掉 

DesignControl恢复回来了,不好的是DesignWebControl成了一白板:)

(6)解决方案来了

其实上面的这两个控件跟Literal和Label控件像极了,其本身使用一点问题也没有,为了设计时更好看,也为了保护我们的眼睛看的舒服点:),我们能做点什么.

一切的一切都是因为.net提供了设计时支持,不然的话,恐怕你连上面的几个界面也看不到了.还好我们可以自己来改变它.那便是利用.net的设计时支持.

(7)每个控件都应该有各自的设计时支持

不知道这句话,大家是否认同,即使控件现在可能不需要,但请做好以后的准备,先空定义一个也可以

下面我们讨论下label控件.

7.1当Text属性为空时,设计器呈现为"["加控件ID的值"]",如[Label1],注意这个是设计器呈现,而非生成的效果呈现.

7.2Control类没有width和height属性,当然设计时也就不支持更改了.

(8)实现

上面说了一大堆废话,还是来看看如何实现吧

  1. public class DesginWebControlDesigner : ControlDesigner  
  2.     {  
  3.         private DesginWebControl webControl;  
  4.  
  5.         public DesginWebControlDesigner()  
  6.         { }  
  7.  
  8.         //初始化控件设计器  
  9.         public override void Initialize(IComponent ponent)  
  10.         {  
  11.             base.Initialize(ponent);  
  12.  
  13.  
  14.             webControl = (DesginWebControl)ponent;  
  15.             webControl.Text = "DesginWebControl";  
  16.               
  17.         }  
  18.  
  19.         //调整控件的大小  
  20.         public override bool AllowResize  
  21.         {  
  22.             get 
  23.             {  
  24.                 return false;  
  25.             }  
  26.         }  
  27.  
  28.         //获取设计器HTML  
  29.         public override string GetDesignTimeHtml()  
  30.         {  
  31.             if (webControl.Text.Length ﹥ 0)  
  32.             {  
  33.                 string spec = "﹤font color='red'﹥{0}﹤/font﹥";  
  34.                 return String.Format(spec, webControl.Text);  
  35.             }  
  36.             else 
  37.                 return GetEmptyDesignTimeHtml();  
  38.         }  
  39.  
  40.         //定义一个空的实现  
  41.         protected override string GetEmptyDesignTimeHtml()  
  42.         {  
  43.             string spec = "[{0}]";  
  44.             return String.Format(spec, webControl.ID);  
  45.         }  
  46.     } 

(1)Initialize方法初始化控件设计时的状态

(2)AllowResize属性默认为True,设置为False,控件就无法在设计器了调整控件大小了

(3)GetDesignTimeHtml方法 最终获取控件在设计器中的状态

(4)GetEmptyDesignTimeHtml方法 定义一个空的实现

定义好以后再将控件与设计器关联起来

  1. [Designer(typeof(DesginWebControlDesigner))]  
  2. public class DesginWebControl :WebControl  
  3. {  

好了,现在就可以来测试下了

测试 

效果跟定义的一样,这个就是设计时的效果了,当然生成的页面可不是这样的,这个要区分清楚.

这时我们再来修改Text属性,和控件的BackColor属性,发现Text改变了,BackColor属性在更改后设计器效果不变.

注意点:

(1)GetDesignTimeHtml方法呈现的将是控件设计器上最终的效果,使用时,你无法更改在此方法定义的效果,Initialize方法初始化的效果可以更改.

(2)页面呈现效果与设计器呈现效果不一定相同

讲了这么多就讲了最基础的东西,很容易理解的东西,大家可以了解下.

ASP.NET控件设计时支持相关的内容就向你介绍到这里,希望对你了解ASP.NET控件设计时支持有所帮助。

【编辑推荐】

  1. ASP.NET控件开发基础之服务器控件客户端功能
  2. ASP.NET控件开发之控件生成器浅析
  3. ASP.NET控件开发基础的总结详解
  4. ASP.NET模板控件开发浅析
  5. ASP.NET数据绑定控件开发浅析
责任编辑:仲衡 来源: 博客园
相关推荐

2009-08-07 17:09:24

ASP.NET控件设计时支持

2009-08-07 17:17:43

ASP.NET控件设计

2009-08-07 17:49:44

控件设计器

2009-08-07 17:59:35

控件设计器

2009-07-27 17:25:53

ASP.NET验证控件

2009-08-07 15:24:16

ASP.NET模板控件

2009-08-05 16:53:14

ASP.NET组件设计

2009-08-04 17:28:45

Apache支持ASP

2009-08-10 13:32:15

ASP.NET TimASP.NET组件设计

2009-07-24 09:57:25

ASP.NET HTM

2009-08-07 15:34:15

ASP.NET数据绑定

2009-08-04 15:20:59

ASP.NET数据验证数据验证控件

2009-08-06 18:18:27

ASP.NET控件开发ASP.NET复合控件

2009-07-28 16:21:03

Asp.net AjaAutoComplet

2009-08-06 15:21:45

ASP.NET控件开发RenderConte

2009-08-03 18:00:00

ASP.NET服务器控

2009-08-06 17:13:56

ASP.NET自定义控

2009-08-10 14:16:59

ASP.NET自定义控

2009-08-07 17:41:07

ASP.NET Web

2009-07-28 09:32:41

ASP.NET自定义控
点赞
收藏

51CTO技术栈公众号