简单实用的GroupBox控件

1.功能介绍:可以像winform里的分组控件一样把web页面上的控件进行分组。功能虽小,但是实用。有时候我们在进行
                  web开发的时候,总是想用个这样的东西,把同一类属性或操作的控件放到一个区域里,可以让用户很清楚地
                  就能知道这是干什么的,给用户带来很好的体验。其实我最想做这样的东西了,有时候觉得这样的小东西,  
                  太简单,后来在看discuz源码的时候,在后台突然发现有这样的东西,我觉得很不错,就索性写了写,有那里
                   不好的地方还请大家批评指正。^_^
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方法呢?
 小结一下:
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);
}

在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);
 }
}

在WebControl基类中的RenderContents方法的实现示意性代码如下:
protected override void RenderContents(HtmlTextWriter output){ 
 
//使用默认逻辑来呈现子控件,那么一定要调用基类中的方法。 
 base.Render(output);
}

分析以上代码可以得出以下结论:

  一、为了在由WebControl派生的类中实现控件呈现,必须重写AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等方法中的一个或者多个,而不必重写Render方法。

  二、重写AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等方法非常重要(请注意重写这些方法的条件及注意事项),否则服务器控件可能会出现丢失标签的情况,这将严重影响服务器控件的呈现。

  三、当呈现服务器控件标签中的内容时,必须重写RenderContents方法。

  上文介绍了WebControl类的一些基本知识。尤其是对于上文所列举的示意性代码需要重点理解。这对于实现控件呈现有着重要作用。


5.源代码下载
下载:/Files/HeroBeast/groupbox.rar

欢迎大家加入 "小强控件园" ,有更多惊喜等着你,进入小强控件园
工欲善其事,必先利其器

原文地址:https://www.cnblogs.com/HeroBeast/p/1043720.html