ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

                                             第四章 组合控件开发CompositeControl

 

          大家好,今天我们来实现一个自定义的控件,之前我们已经知道了,要开发自定义的控件一般继承三个基

类:Control,WebControl,还有一个就是今天要说的CompositeControl。

系列文章链接:

ASP.NET自定义控件组件开发 第一章 待续

ASP.NET自定义控件组件开发 第一章 第二篇 接着待续

ASP.NET自定义控件组件开发 第一章 第三篇

ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件

ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡

ASP.NET自定义控件组件开发 第五章 模板控件开发

ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

ASP.NET2.0组件控件开发视频 初体验

 

 

          大家也许还记得,之前的开发的控件基本上都是我们自己从头到尾的写一些控件的标记,如<table.....>之类的,

 

而且还有一个大的问题:我们为了使得我们的控件更加的好用,专业,我们还实现了大量的接口,和自己写很多的事件.这样

 

开发控件的时间就加大了。其实我们可以利用ASP.NET中已经有的控件,经过我们包装,实现我们自定义控件。大家可能认

 

为这和用户控件差不多的,但是继承CompositeConytol的控件的自定义控件的灵活性和复用行更好,而且还还添加样式。

 

          还一个更加重要的就是我们不必要实现接口,比如,引发回传的IPostBackEventHandler接口,接受数据的

 

IPostBackDataHandler接口。大家还记得我们之前开发控件中的的那个Button还要申明name为 this.UniqueID ,

 

现在我们都不需要了,因为我们要包装的那些服务器的控件,如TextBox,他们都已经实现了这些。

 

 

          本章准备开发一个大家都熟知的Login登录控件。

     

          大家先看看效果:

     

          

          其实分析起来,这个控件是由一些已有的控件组合而成的,分别是:

          两个Label,两个TextBox,和一个Button

 

          下面我们就来开发:

          

          首先,还是先继承CompositeControl;

          

         

Code

 

          然后把就申明我们要组合的控件,如上所说的:

          

          

Code

 

         把控件申明了之后只要初始化,并且将这些控件整合成我们的Login 控件就可以了。这么做呢?

 

           其实开发组合控件很简单,一般只要重写一个方法就可以了。这个方法就是来初始化并且整合那些已经申明了的小

 

控件的。如下:

     

          

Code

 

          大家特别要注意,最后的那句ChildControlsCreated属性,一定要申明,因为在页面的声明周期的任何时候可能调

 

用上面的那个方法,如果不申明ChildControlsCreated,那么这个方法就会被反复的调用,那么我们控件的状态都会丢失。

 

如果申明了ChildControlsCreated=true,那么这个方法就调用一次。

 

 

          经过上面的步骤之后,其实我们的控件就已经开发完成了。

 

          可能我们还想进一步的向我们ASP.NET的标准的Login控件靠拢.那么我们的控件还缺少什么?

 

          属性,事件!!!

          

          以前我们定义属性都是用的ViewState["..."],但是这里就不同了。因为我们的控件是有很多的小的控件组

 

合起来的,比如,我们修改“用户名:”的那个Label,我们想改的是那个Label的属性,还是看看效果图:

 

          改前的图:                                                       改后的图

 

           

 

          就是说,我们想把子控件的属性如Text,name等等,把这些属性上升呈现为组合控件Login的属性。

 

          怎么做?

               

 

 

 

          也很简单的:如下:

 

          

Code

 

 

          这样我们就把那个显示用户名的Label的Text属性显示为了Login控件的UserNameLabelText属性。大家要注意

 

 EnsureChildControls(); 这个方法的调用。其实是个保险的:确保我们要显示属性的那个控件已经创建,已经初始化了。

 

          大家可以根据需要显示更加多的属性。也可以自己定义一些属性,还是像以前那样,可以用ViewState[''.."]

 

           如果到这里为止,就差不多了。大家可以按按照上面的方法来写控件。

 

          大家可以看见,控件的呈现很乱。那些Label.TextBox都布局的很乱。其实你可以根据需要来将上面的那些控件排列

 

的更加好看些,只要重写一个方法就行了:

 

          

 

Code

 

 

     还是像之前一样,我们想把控件用一个Table来布局,先这样

 

         

 

 

Code

          

     然后再把那些Label,TextBox,Button放到table的行和列中就行了。如下:

 

 

          

Code

 

     

     这样,我们的控件就写完了。

 

     我们的控件还差事件。我们在下篇将“事件的冒泡”。

 

     顺便做个调查:大家想看开发控件的视频吗,我正在录制。

 

      完整的代码:如下:

 

 

 

Code

     

                    

posted @ 2008-08-24 13:52  小洋(燕洋天)  阅读(8234)  评论(17编辑  收藏  举报