NULL

坚持点,平和点...【My open asp.net control projects http://www.codeplex.com/aspnetControl/】

  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理 ::
  31 随笔 :: 1 文章 :: 895 评论 :: 39 Trackbacks

    主题,区分Control呈现的几个方法!

周五的晚上,和(张兄)聊了一些关于Control的几个呈现方法,收获颇丰,心中窃喜!这几天,女朋友刚好不在家,没她打搅,所以写下这点“文字“,希望对大家有帮助!

都知道Control一般用三个方法来呈现自己,RenderControlRenderRenderChildren方法,下面讲讲方法的大致用途!

RenderControl方法,通过判断ControlVisible属性,决定是否调用Render方法!大家应该经常把某些控件的Visible属性,设置成Visible=false,这样控件就被隐藏了!

Render方法,当Control.Visible=true时,Render方法被调用!然后Render方法调用RenderChildren(),其他什么事情都不做,唯一的任务就是掉用这个方法!

RenderChildren方法,先呈现自己,然后判断Control_occasionalFields.Controls字段是否为null,如果不为null,不断循环调用RenderControl方法,直到轮循完所有的子控件!

下面是我的一点心得;

一;_occasionalFields.Controls中的Controls并不是Control类的属性,而是OccasionalFields类的一个类型为ControlCollection的字段

       二;一般不要重写ControlRenderControl方法,因为RenderControl方法还要判断Visible属性,来决定是否要调用ControlRender方法!(如果您一定要重写她,那我也没办法,但不要忘记掉用base.RenderControl方法,以便base调用Render方法!)

       三;一般重写ControlRender方法,而且最好加上base.Render方法,为什么呢?因为Render方法要调用RenderChildren方法!

       四;千万不要重写RenderChildren方法,因为这不是设计人员应该动的地方,因为这个方法唯一的目的,就是轮循调用Controls.RenderControl方法,如果人为的加上一些输出,将有可能破坏控件呈现的结构!

总结;

 

       非常抱歉,因为工作比较忙,没有把代码贴出来!不过,大家不用担心,我也是参考了Clingingboy(张兄)的文章!

 

       如果,觉得比较这些“文字”比较枯涩,那么可以先看看张兄的文章,再回头看看,也许感觉就会不同,哈哈!

 

   

补充;

 

       后来发现,重写Control.RenderControl方法,就算调用了base.RenderControl方法,呈现的字节仍为0,所以建议大家不要重写RenderControlRenderChildren方法!

 

图一



       有人问我,“为什么重写ControlRender方法的时候,没有调用base.Render方法,效果确和调用了base.Render方法,没有区别?”,告诉大家原因,那是因为你的控件没有包含其他子控件,所以看不出来!

 

参考;

张兄的文章http://www.cnblogs.com/Clingingboy/archive/2006/08/01/465397.html

posted on 2008-03-17 09:09 王孟军! 阅读(3211) 评论(12)  编辑 收藏 所属分类: asp.net Controls

评论

#1楼  2008-03-17 10:23 WOW玩家      
有一个
RenderContents
  回复  引用  查看    

真的不错
  回复  引用    

#3楼 [楼主] 2008-03-17 10:58 王孟军!      
@WOW玩家

1。RenderContents是WebControl的方法,
2。从字面意思看,就是呈现WebControl的”内容“,这个“内容”为TagKey后面的所有的”属性“

3。默然实现为调用base.Render方法,
4。有时间,在把WebControl补上,
不过,如果弄清楚了Control的呈现,再理解WebControl的呈现就容易多了!

  回复  引用  查看    

#4楼  2008-03-17 14:29 imxjb [未注册用户]
建议研究的更深些,从page开始
  回复  引用    

#5楼  2008-03-17 16:03 Cat Chen      
不错,实际上逻辑应该是这样的:

1.RenderControl是被外界调用的,意思是“呈献此控件吧”,因此不应该被修改。它会自动根据Visible等条件来判断是否呈献,除非你要引入更多的判断,否则就别管了。

2.Render是实际的呈献逻辑,和RenderControl实现了分离,这个模式可以在《Framework Design Guideline》一书查到,也就是不要对外暴露虚拟函数。
  回复  引用  查看    

#6楼 [楼主] 2008-03-17 20:13 王孟军!      
@Cat Chen
谢谢支持,说的没错
这些方法,一般都有两个相同名称的重载,
实例方法,用来实现,
虚拟方法,调用base.实例方法,
这样起到更好的封装作用,还可以方便用户重写虚拟方法
  回复  引用  查看    

#7楼  2008-03-18 10:26 天生俪姿      
关注中。。
  回复  引用  查看    

#8楼  2008-03-18 10:48 cslar      
有女朋友在写不下去吗

  回复  引用  查看    

#9楼 [楼主] 2008-03-18 10:54 王孟军!      
@cslar
楼上的大哥
你这个问题 也忒那个了...
  回复  引用  查看    

#10楼  2008-07-01 15:43 火无极      
孟孟写的控件开发系列真好,我学习啦
谢啦!
  回复  引用  查看