WebControl的Reading方法有Render,RendControl,RendChildren.
下面以Page类为例,(Page类也由Control类派生)
public
void
RenderControl(HtmlTextWriter writer)
... {
if(Visible)
...{
Render(writer);
}
}
protected virtual void Render(HtmlTextWriter writer)
... {
RenderChildren(writer);
}
protented virtual void RenderChildren(HtmlTextWriter writer)
... {
foreach(Control c in Controls)
...{
c.RenderControl(writer);
}
}
... {
if(Visible)
...{
Render(writer);
}
}
protected virtual void Render(HtmlTextWriter writer)
... {
RenderChildren(writer);
}
protented virtual void RenderChildren(HtmlTextWriter writer)
... {
foreach(Control c in Controls)
...{
c.RenderControl(writer);
}
}
每一个页面都有一个控件树,代表页面所拥有的子控件,为 了生成控件树,页面需要建立一个HtmlTextWriter类的实例,这个实例封装了响应流,接着页面将这个HtmlTextWriter对象传递给RenderControl方法,RenderControl方法 检查控件地Visible属性是否为真,若为真,RenderControl调用自己的Render方法,Render方法默认的调用RenderChildren方法,RenderChidren方法又默认的调用这个控件的子控件的RenderControl方法,通过这种递归的调用,就可以生成控件树,除了Visble属性为假的控件,控件树种的控件都会最终生成,即生成Html,显示于浏览器。