web开发的时候,总是想用个这样的东西,把同一类属性或操作的控件放到一个区域里,可以让用户很清楚地
就能知道这是干什么的,给用户带来很好的体验。其实我最想做这样的东西了,有时候觉得这样的小东西,
太简单,后来在看 discuz源码的时候,在后台突然发现有这样的东西,我觉得很不错,就索性写了写,有那里
不好的地方还请大家批评指正。^_^
![](https://www.cnblogs.com/Emoticons/tusiji/203330868.gif)
2.界面
3。我们来看下代码。很简单。
下面是: RenderContents的代码。
protected
override
void
RenderContents(HtmlTextWriter writer)
{
// <fieldset style="border: green 1px solid; padding: 4px 30px 10px 30px; margin-bottom: 8px; text-align: left">
// <legend style="background:url(../images/users.jpg) no-repeat 6px 35% ;border: green 1px solid;PADDING-LEFT: 60px; FONT-WEIGHT: bold; LINE-HEIGHT: 45px">
// aaa
// </legend>
// sdfgsdfgsdfg
// </fieldset>
writer.AddAttribute(HtmlTextWriterAttribute.Style, _fieldsetstyle);
if ( ! Width.IsEmpty)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, Width.ToString());
}
if ( ! Height.IsEmpty)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, Height.ToString());
}
writer.RenderBeginTag(HtmlTextWriterTag.Fieldset);
writer.AddAttribute(HtmlTextWriterAttribute.Style, _legendstyle);
GroupTitle = this .UniqueID.ToString();
writer.RenderBeginTag(HtmlTextWriterTag.Legend);
writer.Write(GroupTitle);
writer.RenderEndTag();
base .RenderContents(writer);
writer.RenderEndTag();
}
4.上面为什么要用:RenderContents为什么不用Render方法呢?
{
// <fieldset style="border: green 1px solid; padding: 4px 30px 10px 30px; margin-bottom: 8px; text-align: left">
// <legend style="background:url(../images/users.jpg) no-repeat 6px 35% ;border: green 1px solid;PADDING-LEFT: 60px; FONT-WEIGHT: bold; LINE-HEIGHT: 45px">
// aaa
// </legend>
// sdfgsdfgsdfg
// </fieldset>
writer.AddAttribute(HtmlTextWriterAttribute.Style, _fieldsetstyle);
if ( ! Width.IsEmpty)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, Width.ToString());
}
if ( ! Height.IsEmpty)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, Height.ToString());
}
writer.RenderBeginTag(HtmlTextWriterTag.Fieldset);
writer.AddAttribute(HtmlTextWriterAttribute.Style, _legendstyle);
GroupTitle = this .UniqueID.ToString();
writer.RenderBeginTag(HtmlTextWriterTag.Legend);
writer.Write(GroupTitle);
writer.RenderEndTag();
base .RenderContents(writer);
writer.RenderEndTag();
}
小结一下:
WebControl基类中包括的两个方法:Render和RenderContents。Control基类中包括Render方法。由于WebControl类继承自Control类,因此,WebControl类中包含Render方法是无可非议的。然而,WebControl类中却有一个RenderContents方法,并且该方法与Render方法在功能、参数等方面都非常相似。那么在呈现控件过程中到底应该使用哪一个呢?
实际上,在通常情况下,如果服务器控件自WebControl基类派生,那么其中的Render方法很少使用,而主要使用RenderContents方法实现控件呈现。为了说明其中的原因,我们必须了解WebControl基类中Render方法的实现逻辑。
在WebControl基类中的Render方法的实现示意性代码如下所示:
protected
override
void
Render(HtmlTextWriter output)
{
RenderBeginTag(output);
RenderContents(output);
RenderEndTag(output);
}
{
RenderBeginTag(output);
RenderContents(output);
RenderEndTag(output);
}
在WebControl基类中的RenderBeginTag方法的实现示意性代码如下:
public
virtual
void
RenderBeginTag(HtmlTextWriter output)
{
AddAttributesToRender(output);
HtmlTextWriterTag tagKey = TagKey;
if (tagKey != HtmlTextWriterTag.Unknown)
{
output.RenderBeginTag(tagKey);
} else {
output.RenderBeginTag( this .TagName);
}
}
{
AddAttributesToRender(output);
HtmlTextWriterTag tagKey = TagKey;
if (tagKey != HtmlTextWriterTag.Unknown)
{
output.RenderBeginTag(tagKey);
} else {
output.RenderBeginTag( this .TagName);
}
}
在WebControl基类中的RenderContents方法的实现示意性代码如下:
protected
override
void
RenderContents(HtmlTextWriter output){
// 使用默认逻辑来呈现子控件,那么一定要调用基类中的方法。
base .Render(output);
}
// 使用默认逻辑来呈现子控件,那么一定要调用基类中的方法。
base .Render(output);
}
分析以上代码可以得出以下结论:
一、为了在由WebControl派生的类中实现控件呈现,必须重写AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等方法中的一个或者多个,而不必重写Render方法。
二、重写AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等方法非常重要(请注意重写这些方法的条件及注意事项),否则服务器控件可能会出现丢失标签的情况,这将严重影响服务器控件的呈现。
三、当呈现服务器控件标签中的内容时,必须重写RenderContents方法。
上文介绍了WebControl类的一些基本知识。尤其是对于上文所列举的示意性代码需要重点理解。这对于实现控件呈现有着重要作用。
5.源代码下载
下载: /Files/HeroBeast/groupbox.rar
欢迎大家加入 " 小强控件园" ,有更多惊喜等着你,进入 小强控件园
工欲善其事,必先利其器