控件的呈现方法(Rendering)的内核
Public void RenderControl(HtmlTextWriter writer)
{
//判断Visible属性是否为真,如果是,则调用Render方法呈现控件,否则不呈现控件
if(Visible)
{
Render(writer);
}
}
Protected virtual void Render(HtmlTextWriter writer)
{
//在这里写呈现控件本身的代码
…….
//调用RenderChildren方法呈现该控件的子控件
RenderChildren(writer);
}
Protected virtual void RenderChildren(HtmlTextWriter writer)
{
//循环调用每个子控件中的RenderControl方法呈现子控件,递归实现呈现整个页面的控件树
foreach(Control c in Controls)
{
c.RenderControl(writer);
}
}
RenderControl方法用于供外部类进行调用,以生成控件,如父控件调用子控件的Rendercontrol方法.在RenderControl方法只是作了是否显示该控件的判断,如果显示则调用控件的被保护方法Render.
Render方法是呈现控件的核心方法,在现实性自定义控件中,我们一般都是通过重写Render方法来呈现控件的,如果控件是一个容器控件,就要重写RenderChildren方法来呈现子控件.
所有的服务端控件都是从System.Web.UI.WebControl中派生.而WebControl又从Control中派生,所以WebControl具有上述的三个方法,但是又增加了几个方法,它把Render方法又细分成三个方法:RenderBgeginTag,RenderContents,RenderEndTag.Render的实现代码如下:
Protected override void Render(HtmlTextWriter writer)
{
//呈现开始标签
RenderBgeginTag(writer);
//呈现标签的内容
RenderContents(writer);
//呈现结束标签
RenderEndTag(writer);
}
Public virtual void RenderBeginTag(HtmlTextWriter writer)
{
//调用AddAttributesToRender方法,添加标签的属性
AddAttributesToRender(writer);
//判断呈现的标签是否为已知的标签;
HtmlTextWriterTag tagkey=TagKey;
If (tagkey!=HtmlTextWriterTag.Unknown)
{
Writer.RenderBeginTag(tagkey);
}
Else
{
//未知标签,则使用指定的标签名TagName属性
Writer.RenderBeginTag(this.TagName);
}
}
Protected virtual void RenderContents(HtmlTextWriter writer)
{
//如果要呈现子控件,就要调用基类的Render方法
base.Render(writer);
}
看这几个方法,我觉得好象没有多大的必要把render方法分解成三个方法,这样仅对于一呈现单个标签的控件才有意义,对于复合的控件似乎没什么意义,还增加了复杂度.
总结:
1.如果从Control中派生,则应重载Render()方法呈现控件.如果控件是一个容器控件,则应在render方法中调用基类的base.RenderChildren()方法,呈现子控件.
2.如果从Webcontrol类中派生,分两种情况,一种是利用TagKey属性生成输出的html标签,这时应重载RenderContents()方法来呈现控件.第二种是不想呈现默认的的用TagKey生成的html标签,这时应重载Render()方法来呈现控件,如下代码所示:
Protected virtual void Render(HtmlTextWriter writer)
{
//在这里写呈现控件本身的代码
AddAttributesToRender(writer);
RenderContents(writer);
}
Protected virtual void RenderContents(HtmlTextWriter writer)
{
//呈现本控件代码
….
//如果要呈现子控件,就要调用基类的Render方法
base.Render(writer);
}
3.如果从Webcontrol类中派生,并且该控件是一个容器控件,则应在RenderContents中调用base.Render()方法,以呈现子控件.
相关文章:
清华、北大教授同台激辩:脑科学是否真的能启发AI?
作者 | 高卫华出品 | AI科技大本营头图 | CSDN下载自视觉中国广义的智能科学是研究智能背后的科学,需要不断扩展科学研究范围,没有最后的疆域。但脑在几千年内的进化中都相对静止,因此脑科学是“自然科学最后的疆域”。脑科学是一个重要的研究…

CentOS 5 升级mysql5.1启动服务时报错
CentOS 5 升级mysql5.1启动服务时报错: [ERROR] Error message file /usr/share/mysql/english/errmsg.sys had only 481 error messages, but it should contain at least 641 error messages.解决方法是:1.mv /usr/share/mysql/english/errmsg.sys /us…

《JavaScript设计模式》——11.2 一切只因跨域
本节书摘来自异步社区《JavaScript设计模式》一书中的第11章,第11.2节,作者:张容铭著,更多章节内容可以访问云栖社区“异步社区”公众号查看 11.2 一切只因跨域 “哦,为什么会出现,什么是跨域?…
程序员:我不学Python了!!
总学不会Python的原因,归根结底只有一个——学习方法不对。 作为一个唯一将易用性与功能取得平衡的编程语言,无论是编程新手还是多年经验的BATJZ技术大牛,都无可否认如今Python对于一个程序员职业发展的重要性。 所以,你现在能在网…

Javascript Tip(1) 操作剪贴板
javascript可以轻松操作客户端剪贴板内容,不过只适用IE5以上浏览器 javascript可以使用window.clipboardData对象处理剪贴板内容 保存到剪贴板的方法 setData(param1, param2) param1 :数据类型 text 或 URL等. param2 :数据内容 从剪贴板读出数据的方法 getdata(p…

MySQL 自增ID
http://hi.baidu.com/517898291/item/9cac18066030cac6905718e0 http://jiangshuiy.iteye.com/blog/751060 Sina 转载: MySQL: Get next AUTO_INCREMENT value from/for table Note to self: To get the next auto_increment value from a table run this query: SE…

《算法基础:打开算法之门》一1.5 拓展阅读
本节书摘来自华章出版社《算法基础:打开算法之门》一书中的第1章,第1.5节,作者 [美]托马斯 H 科尔曼(Thomas H Cormen),更多章节内容可以访问云栖社区“华章计算机”公众号查看 1.…
Python画出心目中的自己
作者 | 李秋键责编 | 晋兆雨头图 | CSDN下载自视觉中国引言:人脸图像的生成在各个行业有着重要应用,例如刑事调查、人物设计、教育培训等。然而一幅逼真的人脸肖像,对于职业画家也要至少数小时才能绘制出来;对于从未接触过绘画的新…

认识 PHP 的hash函数
Hashing function (散列函式) 在网页应用中被广泛采用,从数码签署、错误检测、登入验证、到压缩储存空间,由于它的原理比较复杂,很多人把它跟加密函式混淆,对于如何运用hash function,如何选择合适的hash function&…

const在函数前与函数后的区别 [转]
[转] http://blog.csdn.net/clozxy/article/details/5679887 一 const基础 如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况: int b 500; const int* a &b; [1] int const …

《HTML5游戏编程核心技术与实战》——2.8 小结
本节书摘来自异步社区《HTML5游戏编程核心技术与实战》一书中的第2章,第2.8节,作者: 向峰 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.8 小结 本章介绍了canvas的一些常用的操作,作为HTML5的最重要的特性,canvas使得…

IANA保留地址
IANA 就是指(Internet Assigned Numbers Authority) ,Internet号分配机构。负责对IP地址分配规划以及对TCP/UDP公共服务的端口定义。国际互联网代理成员管理局(IANA)是在国际互联网中使用的IP 地址、域名和许多其它参数的管理机构。IP地址、自…

张亚勤世界互联网大会谈AI:将变革传统行业,催生新业态
11月23日至24日,一年一度的世界互联网大会互联网发展论坛如期召开。全球疫情冲击下,科技创新成为了海内外共同关注的焦点。其中,人工智能作为新一轮科技革命和产业变革的重要驱动力量,同样饱受关注。 在24日上午的"人工智能…

如何通过参数来切换图表和数据
在报表设计的过程中有时候我们想在一张报表中既可以看到数据又可以看到图表,但是如果把数据和图表放在同一页面中似乎不太美观,所以我们可以用参数来控制是要显示数据还是显示图表。下面来看看如何实现通过参数来切换图表和数据 设计一张既有数据又有图表…

安装 Fedora 22 后要做的事情
Red Hat操作系统的社区开发版的最新成员Fedora 22,已经于2015年5月26日发布了。对这个经典的Fedora发行版的发布充斥着各种猜测和预期,而最终Fedora 22推出了许多重大变化。 就初始化进程而言,Systemd还是个新生儿,但它已经准备好…

针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言第二部552-556条
552. 无人驾驶与自动驾驶 无人驾驶与自动驾驶技术属于人工智能技术范畴,近年来有长足进步。无人驾驶与自动驾驶的实现的与路况密切有关。 根据国际自动机工程师学会2004年制度的“无人驾驶与自动驾驶技术界定标准”,将路况分成5级: 根据美国…

Web的桌面提醒(Popup)
大多数Windows程序都有桌面提醒(Popup)功能,如Msn Messenger,Outlook2003,FoxMail,SharpReader等,对用户来说可以非常的方便最新的信息。 在Web中借用IE5.5的Popup,也可以实现类似的…

linux的裁剪过程,让你的小linux更加完善,赶快试试吧!
一、系统启动流程: 1、POST-->BIOS(Boot Sequence)--> BootLoader(MBR)--> Kernel(initrd,initramfs)--> init (/etc/inittab) 第一步首先加电自检,计算机本身不会执行程序,由此它会…

《Adobe Premiere Pro CC经典教程(彩色版)》——2.2 建立项目
本节书摘来自异步社区《Adobe Premiere Pro CC经典教程(彩色版)》一书中的第2课,第2.2节,作者 【英国】Maxim Jago(马克西姆 亚戈),译者 陈昕昕,郭光伟 ,更多章节内容可以…

针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言第二部557-561条如下
557,解决最后一公里短板,提升语义网络内涵,使之具有实现可解释人工智能(或实现认知智能)的能力,尚待努力! 在跟贴263、521中,谈到提升语义网络内涵的解决之道,要坚持数据…

struts2+hibernate+Spring分层开发
web.xml中要加Spring的listener,struts2的filter的配置。UI struts2: jsp struts.xml ActionSpring ActionSpring:applicationContent-actions.xml Service Spring:applicationContent-services.xml DAO Entity DAL hibernate: …

DataGrid鼠标事件处理
http://blog.csdn.net/bgu/完成功能是DataGrid的页面选中事件、鼠标事件、双击事件改变TR的色彩。代码很简单,只是一点JS操作。JS文件:GridControl.js/*------------ DataGrid鼠标事件处理 ------------功能:用于数据梆定后鼠标事件参数说明:obj:对像thisfontColor:…

《精通 ASP.NET MVC 3 框架(第三版)》----第2章 准备工作 2.1 准备工作站
本节书摘来自异步社区《精通 ASP.NET MVC 3 框架(第三版)》一书中的第2章,第1节,作者: 【美】Adam Freeman , Steven Standerson,译者: 林逸 , 李萍 , 更多章节内容可以访问云栖社区…

DataGrid鼠标事件方法
http://blog.csdn.net/bgu/ JS文件源码:GridColorControl.js/*-----------------调用说明-----------------说明:可用于架设页面事件。入口函数:OnFocusSet(....)如:OnFocusSet( "#000000","#FFFFFF","#…
张亚勤谈数字化3.0:由物理与生物世界的数字化构成 | WIC
11月23日至24日,一年一度的世界互联网大会互联网发展论坛如期召开。全球疫情冲击下,科技创新成为了海内外共同关注的焦点。其中,人工智能作为新一轮科技革命和产业变革的重要驱动力量,同样饱受关注。在24日上午的“人工智能&#…

print_r() 'ThinkPHP\Common\common.php 601
Fatal error: print_r() [<a hrefref.outcontrol>ref.outcontrol</a>]: Cannot use output buffering in output buffering display handlers in D:\www\bjydf\ThinkPHP\Common\common.php on line 601 在thinkphp中用phpexcel导出数据错误<b>Fatal error<…

《Android传感器开发与智能设备案例实战》——导读
本节书摘来自异步社区《Android传感器开发与智能设备案例实战》一书中的目录,作者 朱元波,更多章节内容可以访问云栖社区“异步社区”公众号查看 目 录前 言 第1章 Android开发技术基础 第1章第1.1节智能手机操作系统介绍第1章第1.2节Android的巨大优势[…

详解基于busybox、dropbear、ngnix制作完整的嵌入式Linux系统
说明: 《一》:查看此博文,建议查看笔者上一篇博文(Linux启动过程),因为只有在完全了解Linux系统启动流程及一些配置文件的相关性,在阅读此博文才能有思路,理解起来更容易写。 《二》:此…
CSDN湘苗培优,打造高素质技术人才
前言2020年长沙发出软件再出发号召,同时发布了《长沙市软件和信息技术服务业发展三年(2020-2022 年)行动计划》。当软件产业的生态逐渐建立,企业孵化培育的土壤逐渐肥沃,长沙软件产业焕发出前所未有的活力和生机,一大批软件产业项…

在ASP.NET 中实现单点登录
出自:【孟宪会之精彩世界】 发布日期:2005年1月27日 8点48分0秒 [有删改] 由于某些原因,在我们的应用中会遇到一个用户只能在一个地方登录的情况,也就是我们通常所说的单点登录。在ASP.NET中实现单点登录其实很简单,下…