如大家要转载,请保留本人的版权:
/*
*Description:asp.NET自定义服务器控件内部细节系列教程
*Auther:崇崇-天真的好蓝
*MSN:chongchong2008@msn.com
*Dates:2007-05-20
*Copyright:ChongChong2008 YiChang HuBei China
*/
三 Control和WebControl

        Control和WebControl相关Rendering方法中都使用了System.Web.UI.HtmlTextWriter对象,HtmlTextWriter是一个封装了响应流的类,派生自System.IO.TextWriter,提供了向输出流中写入文本的功能。

        HtmlTextWriter对象常用的一些方法有:AddAttribute , AddStyleAttribute , RenderBeginTag , RenderEndTag 用来生成标签和标签属性。
        HtmlTextWriter的各种方法的参数取值为以下三种枚举类型:HtmlTextWriterAttribute , HtmlTextWriterStyle , HtmlTextWriterTag 。
   1.Control
     Control类的保护属性:
             Context : 是HttpContext类型,为当前的Web请求提供了访问System.Web.HttpContext对象的权限.
             ViewStae : 是StateBag类型,状态信息字典,在回传中被串行化和往返传送

   1.1 Control类的公共成员以及保护成员

asp.NET自定义服务器控件内部细节系列教程三 public class Control : Icomponent , IParserAccessor
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{
asp.NET自定义服务器控件内部细节系列教程三 public Control();
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三 //引用父控件相关
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public virtual Page Pageasp.NET自定义服务器控件内部细节系列教程三{get;set;}
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public virtual Control Parentasp.NET自定义服务器控件内部细节系列教程三{get;}
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public Control BindingContainerasp.NET自定义服务器控件内部细节系列教程三{get;}
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public virtual Control NamingContainerasp.NET自定义服务器控件内部细节系列教程三{get;}
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三 //标识
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public virtual string ClientIDasp.NET自定义服务器控件内部细节系列教程三{get;}
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public virtual string IDasp.NET自定义服务器控件内部细节系列教程三{get;set;}
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public virtual string UniqueIDasp.NET自定义服务器控件内部细节系列教程三{get;}
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三 //引用子控件相关
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 protected bool ChildControlsCreatedasp.NET自定义服务器控件内部细节系列教程三{get;set}
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public virtual ControlCollection Controlsasp.NET自定义服务器控件内部细节系列教程三{get;}
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void CreateChildControls();
asp.NET自定义服务器控件内部细节系列教程三 protected virtual ControlCollection CreateControlCollection();
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void EnsureChildControls();
asp.NET自定义服务器控件内部细节系列教程三 public virtual bool HasControls();
asp.NET自定义服务器控件内部细节系列教程三 public virtual Control FindControl(stirng id);
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void AddParsedSubObject(object obj);
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三 //状态管理相关
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public virtual bool EnabledViewStateasp.NET自定义服务器控件内部细节系列教程三{get;set;}
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 protected bool HasChildViewStateasp.NET自定义服务器控件内部细节系列教程三{get;}
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 protected bool IsTrackingViewStateasp.NET自定义服务器控件内部细节系列教程三{get;}
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 protected virtual StateBag ViewStateasp.NET自定义服务器控件内部细节系列教程三{get;}
asp.NET自定义服务器控件内部细节系列教程三 protected void ClearChildViewState();
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void LoadViewState(object savedState);
asp.NET自定义服务器控件内部细节系列教程三 protected virtual object SaveViewState();
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void TrackViewState();
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三 //生成相关
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public virtual bool Visibleasp.NET自定义服务器控件内部细节系列教程三{get;set;}
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void Render(HtmlTextWriter writer);
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void RenderChildren(HtmlTextWriter writer);
asp.NET自定义服务器控件内部细节系列教程三 public void RenderControl(HtmlTextWriter writer);
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三 //数据绑定
asp.NET自定义服务器控件内部细节系列教程三 public virtual void DataBind();
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public ISite Siteasp.NET自定义服务器控件内部细节系列教程三{get;set;}
asp.NET自定义服务器控件内部细节系列教程三 public virtual void Dispose();
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三 //帮助方法
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 protected virtual HttpContext Contextasp.NET自定义服务器控件内部细节系列教程三{get;}
asp.NET自定义服务器控件内部细节系列教程三 protected string MapPathSecure(string virtualPath);
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 public virtual string TemplateSourceDirectoryasp.NET自定义服务器控件内部细节系列教程三{get;}
asp.NET自定义服务器控件内部细节系列教程三 public string ResolveUrl(string relativeUrl);
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三 //事件相关
asp.NET自定义服务器控件内部细节系列教程三 public event EventHandler DataBinding;
asp.NET自定义服务器控件内部细节系列教程三 public event EventHandler Disposed;
asp.NET自定义服务器控件内部细节系列教程三 public event EventHandler Init;
asp.NET自定义服务器控件内部细节系列教程三 public event EventHandler Load;
asp.NET自定义服务器控件内部细节系列教程三 public event EventHandler PreRender;
asp.NET自定义服务器控件内部细节系列教程三 public event EventHandler Unload;
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void OnDataBinding(EventArgs e) ;
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void OnInit(EventArgs e) ;
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void OnLoad(EventArgs e) ;
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void OnPreRender(EventArgs e) ;
asp.NET自定义服务器控件内部细节系列教程三 protected virtual void OnUnload(EventArgs e) ;
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三 protected EventHandlerList Eventsasp.NET自定义服务器控件内部细节系列教程三{get;} ;
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三 protected virtual bool OnBubbleEvent(object source , EventArgs args) ;
asp.NET自定义服务器控件内部细节系列教程三 protected void RaiseBubbleEvent(object source , EventArgs args) ;
asp.NET自定义服务器控件内部细节系列教程三
asp.NET自定义服务器控件内部细节系列教程三       }
asp.NET自定义服务器控件内部细节系列教程三

   1.2 Control的相关Rendering方法

1asp.NET自定义服务器控件内部细节系列教程三 public void RenderControl(HtmlTextWriter writer)
2asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{
3asp.NET自定义服务器控件内部细节系列教程三 if(Viusible)
4asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{
5asp.NET自定义服务器控件内部细节系列教程三             Render(writer);
6asp.NET自定义服务器控件内部细节系列教程三         }
7asp.NET自定义服务器控件内部细节系列教程三     }

     生成一个控件,当页面生成控件树时,在每个子控件上都要调用RenderControl。当控件的visible属性为真时,RenderControl通过调用Render方法来实现。

asp.NET自定义服务器控件内部细节系列教程三 protected virtual void Render(HtmlTextWriter writer)
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{
asp.NET自定义服务器控件内部细节系列教程三 RenderChildren( writer);
asp.NET自定义服务器控件内部细节系列教程三     }

     通过编写标记生成自身,当控件直接从Control派生时,应该重载这个方法来生成需要的内容。

asp.NET自定义服务器控件内部细节系列教程三 protected virtual void RenderChildren(HtmlTextWriter writer)
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{
asp.NET自定义服务器控件内部细节系列教程三 foreach(Control c in Controls)
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{
asp.NET自定义服务器控件内部细节系列教程三             c.RenderControl(writer);
asp.NET自定义服务器控件内部细节系列教程三         }
asp.NET自定义服务器控件内部细节系列教程三     }
asp.NET自定义服务器控件内部细节系列教程三

     生成子控件,默认情况下子控件按照它们加入控件的Controls集合时的顺序生成。

     从以上可以看出,页面将HtmlTextWriter对象传递给公共的RenderControl方法,RenderControl检查控件的Viusible属性是否为真,如果为真,RenderControl调用保护的Render方法,Render方法默认实现会调用RenderChildren方法,RenderChildren方法默认调用每个子控件的RenderControl方法,通过这种递归调用的方法就可以生成控件树。

   2 WebControl
   WebControl继承自Contrl,它重写了Render方法,实现了一段程序逻辑。
   WebControl类的保护属性:
      TagKey : 是HtmlTextWriterTag类型,重载这个属性来生成一个标准的HTML标签,以取代WebControl类生成默认的<span>标签
      TagName : 是String类型,重载这个属性来生成一个非标准的HTML标签,而不是默认的<span>标签

   2.1 WebControl的相关Rendering方法

asp.NET自定义服务器控件内部细节系列教程三 protected override void Render(HtmlTextWriter writer) 
asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{
asp.NET自定义服务器控件内部细节系列教程三      RenderBeginTag(writer);
asp.NET自定义服务器控件内部细节系列教程三      RenderContents(writer);
asp.NET自定义服务器控件内部细节系列教程三      RenderEndTag(writer);
asp.NET自定义服务器控件内部细节系列教程三   }

 1asp.NET自定义服务器控件内部细节系列教程三 public virtual void RenderBeginTag(HtmlTextWriter writer)
 2asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{
 3asp.NET自定义服务器控件内部细节系列教程三      AddAttributesToRender(Writer);
 4asp.NET自定义服务器控件内部细节系列教程三      HtmlTextWriterTag tagKey = TagKey ;
 5asp.NET自定义服务器控件内部细节系列教程三 if(tagKey != HtmlTextWriterTag.Unknown)
 6asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{
 7asp.NET自定义服务器控件内部细节系列教程三        writer.RenderBeginTag(tagKey);
 8asp.NET自定义服务器控件内部细节系列教程三      }
 9asp.NET自定义服务器控件内部细节系列教程三 else
10asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{
11asp.NET自定义服务器控件内部细节系列教程三        writer.RenderBeginTag(this.TabName);
12asp.NET自定义服务器控件内部细节系列教程三      }
13asp.NET自定义服务器控件内部细节系列教程三   }

1asp.NET自定义服务器控件内部细节系列教程三 protected virtual void RenderContents(HtmlTextWriter writer)
2asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{
3asp.NET自定义服务器控件内部细节系列教程三 base.Render(writer);
4asp.NET自定义服务器控件内部细节系列教程三   }

1asp.NET自定义服务器控件内部细节系列教程三 public virtual void RenderEndTag(HtmlTextWriter writer)
2asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三asp.NET自定义服务器控件内部细节系列教程三{}

   当需要生成Web控件标签中的内容时,需要重载RenderContents方法,在一些Web控件中,还需要重载Render方法。

相关文章:

  • 2021-12-31
  • 2022-12-23
  • 2022-02-23
  • 2021-11-28
  • 2021-08-22
  • 2021-10-16
  • 2021-10-30
  • 2022-12-23
猜你喜欢
  • 2022-02-13
  • 2021-08-27
  • 2021-09-25
  • 2021-10-30
  • 2021-06-18
  • 2021-12-05
  • 2021-10-19
相关资源
相似解决方案