参考《 庖丁解牛 纵向切入ASP.NET3.5控件和组件开发技术》
所有的控件的显示输出定义从Control控件的RenderControl方法开始。
该方法的调用嵌套顺序如下:
public virtual void RenderControl(HtmlTextWriter writer)
|
WebControl控件重新定义了Render方法,该方法的调用嵌套顺序如下:
protected internal override void Render(HtmlTextWriter writer)
|
CompositeControl控件再次重新定义了Render方法,但这次修改不多,仅仅在执行WebControl控件的Render方法前增加了一条创建子控件的方法this.EnsureChildControls()。
protected internal override void Render(HtmlTextWriter writer) { if (base.DesignMode) { this.EnsureChildControls(); } base.Render(writer); } |
由此可见,最主要的控件HTML标记输出在WebControl控件中获得定义。
为了使控件能够在窗口中任意定位,我们最好重载AddAttributesToRender方法,将样式写入主控件的外层属性标签中,同时,重载TagKey属性,以便让RenderBeginTag方法生成我们所希望的外层HTML标签元素。
但真正使主控件不能自由定位的原因其实是TagKey属性。假如我们没有重载该属性,则默认情况下该属性为HtmlTextWriterTag.Span||HtmlTextWriterTag.A,而这2个HTML元素是没有定位功能的。所以,我们只要重载TagKey属性为<DIV>元素或其他可定位的元素就可以了。因为在WebControl控件的AddAttributesToRender方法内支持样式style的定义。当然自己定义一下心中有数一些。
而关于主控件的定位问题,往往在主控件的位置需要根据页面的其他元素位置时,才显得非常重要。
另外就是子控件的定位。如果主控件有几个子控件,必须按主控件的位置来定位,而且是绝对定位,此时,可能也需要对子控件的定位进行一些控制。
方法如下:
protected override void AddAttributesToRender(HtmlTextWriter writer) { #region 将主控件的style标记属性写到呈现输出流中 /// 引入基类主控件属性呈现后,控件的定位问题就可以解决了。 /// 如下代码也可以实现控件的定位问题 /// 该问题无非就是将主控件的style标记属性写到呈现输出流中
System.Web.UI.AttributeCollection attributesxx = this.Attributes; System.Collections.IEnumerator enumerator = attributesxx.Keys.GetEnumerator(); while (enumerator.MoveNext()) { string current = (string)enumerator.Current; if (current.ToLower() == "style") { writer.AddAttribute(current, attributesxx[current]); break; } }
#endregion 将主控件的style标记属性写到呈现输出流中 base.AddAttributesToRender(writer); } |
/// <summary> /// 重载TagKey属性, 使用<Table>替换掉默认的<Span> /// </summary> protected override HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Div; } } |