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个方法CopyFrom和MergeWith,他们的区别在于,使用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等。