• 摘要  

  上一篇我们讲到了自定义标签TagPrefix用法,此篇我们来讲一下控件的呈现,主要是呈现下拉框

  • 内容

  呈现的方法有,Render,RenderControl,RenderChildren,这三个方法,其实我也最近才搞明白的,生怕自己忘记,所以就在记下来了,以前学Asp.net页面生命周期的时候,对这些更是一知半解,对此是耿耿于怀,如鲠在喉 ,现在总算是把疑问解决了。

  我们先来看看这三个方法底层的实现方法吧,下面是Control类的呈现方式  

     protected internal virtual void Render(HtmlTextWriter writer)
{
this.RenderChildren(writer);
} protected internal virtual void RenderChildren(HtmlTextWriter writer)
{
ICollection children = this._controls;
this.RenderChildrenInternal(writer, children);
} internal void RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
{
if ((this.RareFields != null) && (this.RareFields.RenderMethod != null))
{
writer.BeginRender();
this.RareFields.RenderMethod(writer, this);
writer.EndRender();
}
else if (children != null)
{
foreach (Control control in children)
{
control.RenderControl(writer);
}
}
} [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public virtual void RenderControl(HtmlTextWriter writer)
{
this.RenderControl(writer, this.Adapter);
} protected void RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
{
if (!this.flags[0x10] && !this.flags[0x200])
{
HttpContext context = (this.Page == null) ? null : this.Page._context;
if ((context != null) && context.TraceIsEnabled)
{
int bufferedLength = context.Response.GetBufferedLength();
this.RenderControlInternal(writer, adapter);
int num2 = context.Response.GetBufferedLength();
context.Trace.AddControlSize(this.UniqueID, num2 - bufferedLength);
}
else
{
this.RenderControlInternal(writer, adapter);
}
}
else
{
this.TraceNonRenderingControlInternal(writer);
}
} private void RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
{
try
{
this.BeginRenderTracing(writer, this);
if (adapter != null)
{
adapter.BeginRender(writer);
adapter.Render(writer);
adapter.EndRender(writer);
}
else
{
this.Render(writer);
}
}
finally
{
this.EndRenderTracing(writer, this);
}
}

代码是不是太长啦。。。看得很烦。说穿了,他们的调用顺序是:首先调用RenderControl方法,RenderControl方法里面调用Render方法,Render方法调用RenderChildren方法,RenderControl也是通过一个循环遍历子控件,每遍历一次调用RenderControl一次,直到子控件全部被遍历完。
详情请见:http://wenku.baidu.com/view/13db1afdfab069dc502201b9.html

一般情况下,我们都只重写Render方法,其他两个方法最好别碰。

  现在我们来呈现一个下拉框,我们来分析一下,下拉框,我们可以理解为一个Div,其实我们最主要的目的就是呈现一个下拉框

using System;
using System.Text;
using System.Web.UI;
using System.ComponentModel;//包含组件开发所必须含有的(属性)Attribute;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Collections.Generic; namespace XYB.Controls
{
public class TextEdit:TextBox
{
private int _dropDwonHeight;
[Description("下拉框的高度"),//属性的描述
Category("下拉框")//所属目录
]
public int DropDwonHeight
{
get { return _dropDwonHeight; }
set { _dropDwonHeight = value; }
}
private int _dropdwonWidth;
[Description("下拉框的宽度"),
Category("下拉框")
]
public int DropdwonWidth
{
get { return _dropdwonWidth; }
set { _dropdwonWidth = value; }
} protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
Panel pnlDropDown = new Panel();
pnlDropDown.ID = "pnlDropDownID";
pnlDropDown.Height = DropDwonHeight;
pnlDropDown.Width = DropdwonWidth;
pnlDropDown.Style["border"] = "1px solid #ccc";//设置边框样式
pnlDropDown.RenderControl(writer);//把下拉框呈现到网页上
}
}
}

本章结束,

  • 下集预告

  ViewState视图保存属性状态,敬请大家关注我!  

最新文章

  1. gnu coreutils-8.25 for win32 static - Beta
  2. 后台js弹提示
  3. iOS数据持久化-OC
  4. linux源码Makefile详解(完整)【转】
  5. jsp和servlet的区别
  6. window注册表
  7. POJ1260Pearls
  8. RX编程笔记——JavaScript 获取地理位置
  9. 使用AVCaptureSession捕捉静态图片
  10. C 语言的可变参数表函数的设计
  11. 如何正确理解正则表达式中的分隔符 \b
  12. gridview中使用href调用javascript
  13. CoreCLR源码探索(六) NullReferenceException是如何发生的
  14. VBA批量导入图片到多Word文档并加标题(会飞的鱼)
  15. shogun docker image 中import shogun error
  16. Ubuntu 普通用户无法启动Google chrome
  17. 【noip模拟赛6】收入计划 最大值的最小值 二分答案
  18. c# yield关键字原理详解
  19. BI-LSTM-CRF在序列标注中的应用
  20. CentOS 静态IP设置&修改网卡名

热门文章

  1. 网页游戏中PK系统的实现
  2. MvvmCross框架在XamarinForms中的使用入门
  3. JS案例练习:图片切换+切换模式
  4. Linux常用命令-1
  5. String和string
  6. JAVA设计模式初探之适配器模式(转)
  7. ZOJ-1654 Place the Robots---二分图最小点覆盖+构图
  8. Nginx源码安装及调优配置(转)
  9. 【51nod1743】雪之国度(最小生成树+倍增)
  10. thymeleaf获取当前时间并格式化输出