ASP.NET服务器控件的开发(2)

来源:互联网 发布:粒子群优化算法示意图 编辑:程序博客网 时间:2024/06/05 09:12
3.2         System.Web.UI.WebControls.WebControl类介绍
 
    该类是继承自基本控件类Control类的,我们可以使用Control类所有可被继承的属性和方法等。当然从
该类派生要比从Control类派生要好,我们可以利用WebControl类提供的属性来控制服务器控件的外观和行为,
比如,我们可以控制背景颜色,边框宽度和样式等。下面我们就来大概介绍下WebControl类。
 
3.2.1     AddAttributesToRender方法
 
    该方法是保护类型的,只被继承该类的派生类调用。通过重写AddAttributesToRender方法可以联合构造
函数指定的HTML标记符为呈现指定额外的特性和CSS样式。在介绍该方法前我们先来看下从Control类中继承并重
写了的Render方法我们先来
看下他的代码!
protected override void Render(HtmlTextWriter writer)
{
      this.RenderBeginTag(writer);
      this.RenderContents(writer);
      this.RenderEndTag(writer); //结束构造函数中指定的HTML标记符
}
在执行体中调用了3个方法,这3个方法加上AddAttributesToRender方法是呈现服务器控件内容的关键方法,
我们再来看下RenderBeginTag方法的代码!
public virtual void RenderBeginTag(HtmlTextWriter writer)
{
      this.AddAttributesToRender(writer);
      HtmlTextWriterTag tag1 = this.TagKey;
      if (tag1 != HtmlTextWriterTag.Unknown)
      {
            writer.RenderBeginTag(tag1);
      }
      else
      {
            writer.RenderBeginTag(this.TagName);
      }
}
在该方法的执行体中首先调用了AddAttributesToRender方法为控件添加HTML特性和值
this.AddAttributesToRender(writer);
下面我们看下构造函数的代码
protected WebControl() : this(HtmlTextWriterTag.Span) //默认的HTML标记符为Span
{
}
public WebControl(HtmlTextWriterTag tag)
{
      this.tagKey = tag;
}
接着指定HTML标记符HtmlTextWriterTag tag1 = this.TagKey;
最后调用RenderBeginTag方法将标记符写入输出流中。看到这里我们在回到正题来看
AddAttributesToRender方法,同样我们来看看执行体中的部分代码!
protected virtual void AddAttributesToRender(HtmlTextWriter writer)
{
      string text1;
      if (this.ID != null)
      {
            writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID); //添加ID特性和值
      }
……
……
……
      if (this.ControlStyleCreated && !this.ControlStyle.IsEmpty)
      {
          //添加样式特性,该方法我们会在讲Style类时讲到
            this.ControlStyle.AddAttributesToRender(writer, this); 
      }
      if (this.attrState != null)
      {
          //得到包含了HTML特性的属性,该属性我们在讲WebControl类属性时讲到
            AttributeCollection collection1 = this.Attributes
            IEnumerator enumerator1 = collection1.Keys.GetEnumerator();
            while (enumerator1.MoveNext())
            {
                  string text2 = (string) enumerator1.Current;
                    //将特性添加到输出流
                  writer.AddAttribute(text2, collection1[text2]);
            }
      }
}
看下我对该方法执行体的注释应该就能很快了解AddAttributesToRender方法的用途,其实简单的说来就为构造函数中
指定的HTML标记符添加特性。一样我们会重写该方法为标记符添加更多的特性,但我们要记住,当我们重写该方法时一
定要调用基类该方法。
下面我们使用该方法来修改下例3-1(例3-5)
例3-5:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
 
namespace WebControlLibrary3
{
     [DefaultProperty("Text"),
         ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
     [ParseChildren(true)]
     public class WebCustomControl1 : System.Web.UI.WebControls.WebControl
     {
         [Bindable(true),
              Category("Appearance"),
              DefaultValue("")]
         public WebCustomControl1(): base(HtmlTextWriterTag.Input) //添加HTML标记符
         {
         }
         public string Text
         {
              get
              {
                   if(this.ViewState["text"]!=null)
                   {
                       return this.ViewState["text"].ToString();
                   }
                   return string.Empty;
              }
              set
              {
                   this.ViewState["text"] = value;
              }
         }
         protected override void AddAttributesToRender(HtmlTextWriter writer) //重写
         {
              writer.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Type,"text");
              writer.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Class,"class1");
              writer.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Name,"text1");
              writer.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Value,this.Text);
              writer.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Height,"30");
              writer.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.Width,"160");
              writer.AddStyleAttribute(System.Web.UI.HtmlTextWriterStyle.FontSize,"24");
              base.AddAttributesToRender (writer);
         }
     }
}
我们对代码做了下修改,但调用代码不变,显示结果还是不变(图3-1)
 
3.2.2     RenderContents方法
 
    对于该方法我们就稍稍讲一下因为实在是太简单了,就相当于在例3-1代码
              writer.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Input);
RenderContents方法中的代码相当于就是加在这里的代码
              writer.RenderEndTag();     
     当然我们在重写该方法是最好调用写base.RenderContents (writer);这样就相当与调用了基本控件Control类
RenderChildren方法,可以呈现控件的子控件。
 
3.2.3     ApplyStyle方法与MergeStyle方法
 
     这两个方法是用来把样式添加到服务器控件的,看下他们的代码!
public void ApplyStyle(Style s)
{
      if ((s != null) && !s.IsEmpty)
      {
            this.ControlStyle.CopyFrom(s); //ControlStyle属性我们会在讲属性时讲到
      }
}
public void MergeStyle(Style s)
{
      if ((s != null) && !s.IsEmpty)
      {
            this.ControlStyle.MergeWith(s);
      }
     这2个方法分别调用的样式类的2个方法CopyFromMergeWith,他们的区别在于,使用CopyFrom方法是从一个
样式对象复制样式到调用的样式对象,覆盖当前已有的值。而MergeWith方法只是合并2个样式,第1个样式已有的样式
特性值不会被第2个样式对象的样式值所覆盖。
 
3.2.4     CreateControlStyle方法
 
     该方法是保护成员。当我们的控件有自定义的样式时,我们一般会对该方法进行重写,以得到我们自定义的样式
类的实例对象。
看下他的代码:
protected virtual Style CreateControlStyle()
{
   return new Style(this.ViewState); //使用当前的ViewState属性创建Style类的ViewState
}
在WebControl类中用Style返回类的构造函数Style类的实例对象。
 
3.2.5     WebControl类中的属性
 
Attributes属性,该属性使只读的。利用该属性我们可以为利用构造函数添加的HTML标记符添加特性。该属性是
AttributeCollection类型的,我们可以利用该类的Add方法或索引为HTML标记符添加特性,
如Attributes.Add("name", "name1")或使用索引
This.Attributes["name "]= "name1 "
ControlStyle属性,该属性也是只读的。我们在前面对该属性已经使用了,该属性是样式属性,一般我们在编写
自己的控件时不用人为使用该属性,当我们调用ApplyStyle方法或MergeStyle方法时就会读取该属性了。
     ControlStyleCreated属性,该属性是只读的。我们可以读取该属性确定我们的控件样式是否被指定。
     Style属性,该属性是只读的,类型为CssStyleCollection类。利用该属性我们可以为控件定义CSS样式,使用
方法和Attributes属性一样可以用Add方法和索引指定样式。在页面显示时添加的所有名-值对都会在指定的HTML标记符的
style特性里面。
     TabIndex属性,通过该属性我们可以设置或获取在构造函数中指定的HTML标记符的Tabindex特性的值,该值是
short类型的,
我们在读写是要注意。
     TagKey属性,该属性是只读的,而且是保护成员。通过该属性我们可以得到构造函数中指定的HTML标记符。
当然因为该属性是虚属性我们还可以重写它来改变HTML标记符。
     Enabled属性,该属性可读写,当我们设置该属性为false时,就相当与为构造函数中指定的HTML标记符特性
Disabled设置的值为disabled。当为true时,将不设置该特性。
     ToolTip属性,该属性也是可读写的,设置该属性可以为构造函数中指定的HTML标记符设置Title特性的值。

    在WebControl类还定义了一些控件的样式属性,如:BackColor,BorderColor,BorderStyle,BorderWidth,Height,Width。当然因为WebControl类时从Control类继承的,所以WebControl类还具有Control类中定义的属性,如:ViewState,ID等。

原创粉丝点击