控件呈现的顺序

所有的控件的显示输出定义从Control控件的RenderControl方法开始。

该方法的调用嵌套顺序如下:

public virtual void RenderControl(HtmlTextWriter writer)

protected void RenderControl(HtmlTextWriter writer, ControlAdapter adapter)

private void RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)

protected internal virtual void Render(HtmlTextWriter writer)

protected internal virtual void RenderChildren(HtmlTextWriter writer)

 

WebControl控件重新定义了Render方法,该方法的调用嵌套顺序如下:

protected internal override void Render(HtmlTextWriter writer)

public virtual void RenderBeginTag(HtmlTextWriter writer)

protected virtual void AddAttributesToRender(HtmlTextWriter writer)

protected virtual HtmlTextWriterTag TagKey

protected internal virtual void RenderContents(HtmlTextWriter writer)

base.Render(writer)

public virtual void RenderEndTag(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,而这2HTML元素是没有定位功能的。所以,我们只要重载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;

    }

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值