您的位置:首页 > 编程语言 > ASP

ASP.NET服务器控件的开发(3)(转贴)

2008-04-19 20:30 316 查看
[align=center]3.3System.Web.UI.WebControls.Style类介绍[/align]

该类是一个样式类,这个类可对由WebControl类继承的控件添加了样式属性,具体的做法我们在下面会介绍的。当然

我们也可以创建继承自该类的自定义样式类,为我们的控件添加更加多的样式特性。下面我们开始介绍Style类中的方法和属

性,最后我们会结合实例来说明自定义样式类的使用方法。


3.3.1CopyFrom方法和MergeWith方法


这两个方法我们在讲WebControl类的ApplyStyle和MergeStyle方法时已经有所提到。一般当我们创建自定义样式类的

时候都会重写这2个方法,将我们自定义的样式特性添加到自定义样式类中。当我们重写这两个方法时要记住调用父类Style

中的这两个方法。


3.3.2AddAttributesToRender方法


该方法是我们创建自定义样式类是比较重要的方法,我们一般会重写该方法将自定义样式特性添加到输出流。当然当我们

重写该方法时务必调用基类中的该方法。

这里我们先来看下Style类的构造函数代码:

//该构造函数一般在我们重写继承自WebControl类的控件的CreateControlStyle方法时使用

publicStyle(StateBagbag)

{

//设置statebag为传入的StateBag类对象,一般为我们定义的控件的ViewState属性。

this.statebag=bag;

this.marked=false;

this.setBits=0;

}

下面我们来看下Style类中该方法的部分代码:

publicvirtualvoidAddAttributesToRender(HtmlTextWriterwriter,WebControlowner)

{

Colorcolor1;

Unitunit1;

//将ViewState属性传给bag1,其实也就时将构造函数中设置的statebag成员传给bag1

StateBagbag1=this.ViewState;

if(this.IsSet(2))

{

//得到定义的CssClass特性值

stringtext1=(string)bag1["CssClass"];

if(text1.Length>0)

{

//为输出流添加Class样式特性和值

writer.AddAttribute(HtmlTextWriterAttribute.Class,text1);

}

}

if(this.IsSet(4))

{

color1=(Color)bag1["ForeColor"];

if(!color1.IsEmpty)

{

writer.AddStyleAttribute(HtmlTextWriterStyle.Color,ColorTranslator.ToHtml(color1));

}

}

……

……

……

}

看了这些代码应该知道如何使用该方法和重写该方法了吧!该方法有2个参数,第一个参数是我们指定的要将样式特性输出到

的HtmlTextWrite输出流,第2个参数是要使用样式的控件,一般为我们定义的控件或其子控件。


3.3.3Style类的属性


ViewState属性,该属性是只读的,只能被继承访问。如何设置该属性的呢?我们可以调用该类的构造函数指定私有成

statebag的对象来设置该属性,当我们读取该属性时读取的就是私有成员statebag。该属性在我们调用或重写

AddAttributesToRender方法时要用到,在自定义的样式类属性里也要用到。看下该属性的代码:

protectedinternalStateBagViewState

{

get

{

if(this.statebag==null)

{

//当statebag为空时时将为statebag成员创建新对象

this.statebag=newStateBag(false);

if(this.IsTrackingViewState)

{

this.statebag.TrackViewState();

}

}

returnthis.statebag;

}

}

由于该属性的访问权限为protectedinternal,所以在使用时如何使用大家要注意。

IsEmpty属性,该属性在我们自定义样式类中比较重要,因为该属性访问权限为protectedinternal所以我们

能在派生类中使用该属性,该属性是虚属性所以我们可以重写该属性,用于判断样式类是否有定义样式,该属性在

WebControl类的ApplyStyle和MergeStyle方法中被用到。具体看下面的例子。

Style类中的其他属性还有BackColor,BorderStyle等分别与WebControl类中的样式属性对应。当然我们可以

为自定义的样式类创建更多的样式属性对应于HTML标记符中的样式特性。


3.3.4自定义样式类及其使用实例


本节我们将创建一个表格控件,为HTML表格添加cellpadding,cellspacing,border和background样式特性。

下面我们就来看看示例(例3-6)

例3-6:

[align=left]usingSystem;[/align]
[align=left]usingSystem.Web.UI;[/align]
[align=left]usingSystem.Web.UI.WebControls;[/align]
[align=left]usingSystem.ComponentModel;[/align]
[align=left]namespacestyle_table_3_6[/align]
[align=left]{[/align]
[align=left]//这里我们首先定义一个继承自Style的样式类[/align]
[align=left]publicclassAspTableStyle:Style[/align]
[align=left]{[/align]
[align=left]privateboolisempty;//该变量用于判断自定义样式是否被设置[/align]
[align=left]publicAspTableStyle()[/align]
[align=left]{[/align]
[align=left]isempty=true;//设置样式没被定义[/align]
[align=left]}[/align]
[align=left]publicAspTableStyle(StateBagbag):base(bag)//构造函数调用基类的构造函数[/align]
[align=left]{[/align]
[align=left]isempty=true;[/align]
[align=left]}[/align]
[align=left]publicvirtualintCellPadding//该属性指定表格的单元格边距[/align]
[align=left]{[/align]
[align=left]get[/align]
[align=left]{[/align]
[align=left]if(base.ViewState["CellPadding"]!=null)[/align]
[align=left]{[/align]
[align=left]return(int)base.ViewState["CellPadding"];[/align]
[align=left]}[/align]
[align=left]return0;[/align]
[align=left]}[/align]
[align=left]set[/align]
[align=left]{[/align]
[align=left]if(value<-1)//当值不在范围内将抛出异常[/align]
[align=left]{[/align]
[align=left]thrownewArgumentOutOfRangeException("value");[/align]
[align=left]}[/align]
[align=left]base.ViewState["CellPadding"]=value;[/align]
[align=left]isempty=false;//设置样式已被定义[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]publicvirtualintCellSpacing//该属性指定表格的单元格间距[/align]
[align=left]{[/align]
[align=left]get[/align]
[align=left]{[/align]
[align=left]if(base.ViewState["CellSpacing"]!=null)[/align]
[align=left]{[/align]
[align=left]return(int)base.ViewState["CellSpacing"];[/align]
[align=left]}[/align]
[align=left]return0;[/align]
[align=left]}[/align]
[align=left]set[/align]
[align=left]{[/align]
[align=left]if(value<-1)[/align]
[align=left]{[/align]
[align=left]thrownewArgumentOutOfRangeException("value");[/align]
[align=left]}[/align]
[align=left]base.ViewState["CellSpacing"]=value;[/align]
[align=left]isempty=false;[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]publicvirtualintBorder//该属性指定表格的边框粗细[/align]
[align=left]{[/align]
[align=left]get[/align]
[align=left]{[/align]
[align=left]if(base.ViewState["Border"]!=null)[/align]
[align=left]{[/align]
[align=left]return(int)base.ViewState["Border"];[/align]
[align=left]}[/align]
[align=left]return0;[/align]
[align=left]}[/align]
[align=left]set[/align]
[align=left]{[/align]
[align=left]if(value<-1)[/align]
[align=left]{[/align]
[align=left]thrownewArgumentOutOfRangeException("value");[/align]
[align=left]}[/align]
[align=left]base.ViewState["Border"]=value;[/align]
[align=left]isempty=false;[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]publicvirtualstringBackGround//指定表格的背景图片地址[/align]
[align=left]{[/align]
[align=left]get[/align]
[align=left]{[/align]
[align=left]if(base.ViewState["BackGround"]!=null)[/align]
[align=left]{[/align]
[align=left]return(string)base.ViewState["BackGround"];[/align]
[align=left]}[/align]
[align=left]returnstring.Empty;[/align]
[align=left]}[/align]
[align=left]set[/align]
[align=left]{[/align]
[align=left]if(value==null)[/align]
[align=left]{[/align]
[align=left]thrownewArgumentNullException("value");[/align]
[align=left]}[/align]
[align=left]base.ViewState["BackGround"]=value;[/align]
[align=left]isempty=false;[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]protectedoverrideboolIsEmpty//该属性用于判断样式属性是否被设置[/align]
[align=left]{[/align]
[align=left]get[/align]
[align=left]{[/align]
[align=left]if(isempty==false)[/align]
[align=left]{[/align]
[align=left]returnfalse;[/align]
[align=left]}[/align]
[align=left]//当我们自定义的样式没被设置时返回基类的属性,判断基类中是否有属性被设置[/align]
[align=left]returnbase.IsEmpty;[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]publicoverridevoidAddAttributesToRender(HtmlTextWriterwriter,WebControlowner)[/align]
[align=left]{[/align]
[align=left]base.AddAttributesToRender(writer,owner);[/align]
[align=left]stringtext1=this.BackGround;[/align]
[align=left]if(text1.Length!=0)[/align]
[align=left]{[/align]
[align=left]writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundImage,"url("+text1+")");//指定背景图片[/align]
[align=left]}[/align]
[align=left]intnum1=this.CellSpacing;[/align]
[align=left]if(num1>=0)[/align]
[align=left]{[/align]
[align=left]writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing,num1.ToString());[/align]
[align=left]if(num1==0)[/align]
[align=left]{[/align]
[align=left]writer.AddStyleAttribute(HtmlTextWriterStyle.BorderCollapse,"collapse");[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]num1=this.CellPadding;[/align]
[align=left]if(num1>=0)[/align]
[align=left]{[/align]
[align=left]writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding,num1.ToString());[/align]
[align=left]}[/align]
[align=left]num1=this.Border;[/align]
[align=left]if(num1>=0)[/align]
[align=left]{[/align]
[align=left]writer.AddAttribute(HtmlTextWriterAttribute.Border,num1.ToString());[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]publicoverridevoidCopyFrom(Styles)//这里重写了基类的方法[/align]
[align=left]{[/align]
[align=left]if((s!=null))[/align]
[align=left]{[/align]
[align=left]base.CopyFrom(s);[/align]
[align=left]if(sisAspTableStyle)[/align]
[align=left]{[/align]
[align=left]AspTableStylestyle1=(AspTableStyle)s;[/align]
[align=left]if(style1.BackGround!=null)[/align]
[align=left]{[/align]
[align=left]this.BackGround=style1.BackGround;[/align]
[align=left]}[/align]
[align=left]this.CellPadding=style1.CellPadding;[/align]
[align=left]this.CellSpacing=style1.CellSpacing;[/align]
[align=left]this.Border=style1.Border;[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]publicoverridevoidMergeWith(Styles)[/align]
[align=left]{[/align]
[align=left]if((s!=null))[/align]
[align=left]{[/align]
[align=left]if(this.IsEmpty)[/align]
[align=left]{[/align]
[align=left]this.CopyFrom(s);[/align]
[align=left]}[/align]
[align=left]else[/align]
[align=left]{[/align]
[align=left]base.MergeWith(s);[/align]
[align=left]if(sisAspTableStyle)[/align]
[align=left]{[/align]
[align=left]AspTableStylestyle1=(AspTableStyle)s;[/align]
[align=left]if(style1.BackGround==null)[/align]
[align=left]{[/align]
[align=left]this.BackGround=style1.BackGround;[/align]
[align=left]}[/align]
[align=left]if(style1.CellPadding==0)[/align]
[align=left]{[/align]
[align=left]this.CellPadding=style1.CellPadding;[/align]
[align=left]}[/align]
[align=left]if(style1.CellSpacing==0)[/align]
[align=left]{[/align]
[align=left]this.CellSpacing=style1.CellSpacing;[/align]
[align=left]}[/align]
[align=left]if(style1.Border==0)[/align]
[align=left]{[/align]
[align=left]this.Border=style1.Border;[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]publicoverridevoidReset()[/align]
[align=left]{[/align]
[align=left]if(this.BackGround!=null)[/align]
[align=left]{[/align]
[align=left]base.ViewState.Remove("BackImageUrl");[/align]
[align=left]}[/align]
[align=left]if(this.CellPadding!=0)[/align]
[align=left]{[/align]
[align=left]base.ViewState.Remove("CellPadding");[/align]
[align=left]}[/align]
[align=left]if(this.CellSpacing!=0)[/align]
[align=left]{[/align]
[align=left]base.ViewState.Remove("CellSpacing");[/align]
[align=left]}[/align]
[align=left]base.Reset();[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left][DefaultProperty("Text"),[/align]
[align=left]ToolboxData("<{0}:WebCustomControl1runat=server></{0}:WebCustomControl1>")][/align]
[align=left]publicclassWebCustomControl1:System.Web.UI.WebControls.WebControl[/align]
[align=left]{[/align]
[align=left]publicWebCustomControl1():base(HtmlTextWriterTag.Table)[/align]
[align=left]{[/align]
[align=left]}[/align]
[align=left]publicvirtualintCellPadding//设置控件本身的样式属性[/align]
[align=left]{[/align]
[align=left]get[/align]
[align=left]{[/align]
[align=left]if(!base.ControlStyleCreated)[/align]
[align=left]{[/align]
[align=left]return-1;[/align]
[align=left]}[/align]
[align=left]return((AspTableStyle)base.ControlStyle).CellPadding;[/align]
[align=left]}[/align]
[align=left]set[/align]
[align=left]{[/align]
[align=left]((AspTableStyle)base.ControlStyle).CellPadding=value;[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]publicvirtualintCellSpacing[/align]
[align=left]{[/align]
[align=left]get[/align]
[align=left]{[/align]
[align=left]if(!base.ControlStyleCreated)[/align]
[align=left]{[/align]
[align=left]return-1;[/align]
[align=left]}[/align]
[align=left]return((AspTableStyle)base.ControlStyle).CellSpacing;[/align]
[align=left]}[/align]
[align=left]set[/align]
[align=left]{[/align]
[align=left]((AspTableStyle)base.ControlStyle).CellSpacing=value;[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]publicvirtualintBorder[/align]
[align=left]{[/align]
[align=left]get[/align]
[align=left]{[/align]
[align=left]if(!base.ControlStyleCreated)[/align]
[align=left]{[/align]
[align=left]return-1;[/align]
[align=left]}[/align]
[align=left]return((AspTableStyle)base.ControlStyle).Border;[/align]
[align=left]}[/align]
[align=left]set[/align]
[align=left]{[/align]
[align=left]((AspTableStyle)base.ControlStyle).Border=value;[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]publicvirtualstringBackGround[/align]
[align=left]{[/align]
[align=left]get[/align]
[align=left]{[/align]
[align=left]if(!base.ControlStyleCreated)[/align]
[align=left]{[/align]
[align=left]returnstring.Empty;[/align]
[align=left]}[/align]
[align=left]return((AspTableStyle)base.ControlStyle).BackGround;[/align]
[align=left]}[/align]
[align=left]set[/align]
[align=left]{[/align]
[align=left]((AspTableStyle)base.ControlStyle).BackGround=value;[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]protectedoverrideStyleCreateControlStyle()//重写基类方法创建自定义样式的实例[/align]
[align=left]{[/align]
[align=left]returnnewAspTableStyle(this.ViewState);//返回自定义样式的实例[/align]
[align=left]}[/align]
[align=left]protectedoverridevoidRenderContents(HtmlTextWriterwriter)[/align]
[align=left]{[/align]
[align=left]intnum1=this.Controls.Count;//得到控件的子控件数[/align]
[align=left]intnum2=0;[/align]
[align=left]intnum3=0;[/align]
[align=left]if(num1%4!=0)[/align]
[align=left]{[/align]
[align=left]num2=(num1/4)+1;[/align]
[align=left]}[/align]
[align=left]else[/align]
[align=left]{[/align]
[align=left]num2=num1/4;[/align]
[align=left]}[/align]
[align=left]if(num1!=0)[/align]
[align=left]{[/align]
[align=left]for(intnum5=1;num5<=num2;num5++)[/align]
[align=left]{[/align]
[align=left]writer.RenderBeginTag(HtmlTextWriterTag.Tr);[/align]
[align=left]for(intnum6=1;num6<=4;num6++)[/align]
[align=left]{[/align]
[align=left]writer.RenderBeginTag(HtmlTextWriterTag.Td);[/align]
[align=left]if(num3<num1)[/align]
[align=left]{[/align]
[align=left]this.Controls[num3].RenderControl(writer);//显示单个子控件[/align]
[align=left]}[/align]
[align=left]else[/align]
[align=left]{[/align]
[align=left]writer.Write("null");[/align]
[align=left]}[/align]
[align=left]num3++;[/align]
[align=left]writer.RenderEndTag();[/align]
[align=left]}[/align]
[align=left]writer.RenderEndTag();[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]else[/align]
[align=left]{[/align]
[align=left]writer.RenderBeginTag(HtmlTextWriterTag.Tr);[/align]
[align=left]writer.RenderBeginTag(HtmlTextWriterTag.Td);[/align]
[align=left]writer.Write("没有任何子控件");[/align]
[align=left]writer.RenderEndTag();[/align]
[align=left]writer.RenderEndTag();[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]}[/align]
}

代码确实比较长,但用到了我们前面提到的很多知识,请大家务必认真看下,当然如果你了解该方面的知识是不

用看了,因为这比较的基础。如果大家想运行下该控件可以下载该控件的源代码。

下面我们来看看如何使用该控件,我们先将该控件加入自己的页面然后可以修改后置代码(.cs文件)的

InitializeComponent方法如下:

[align=left]privatevoidInitializeComponent()[/align]
[align=left]{[/align]
[align=left]Buttonbt1=newButton();//新建一个Button控件[/align]
[align=left]bt1.Text="Button1";[/align]
[align=left]Buttonbt2=newButton();[/align]
[align=left]bt2.Text="Button2";[/align]
[align=left]Buttonbt3=newButton();[/align]
[align=left]bt3.Text="Button3";[/align]
[align=left]Buttonbt4=newButton();[/align]
[align=left]bt4.Text="Button4";[/align]
[align=left]Buttonbt5=newButton();[/align]
[align=left]bt5.Text="Button5";[/align]
[align=left]Buttonbt6=newButton();[/align]
[align=left]bt6.Text="Button6";[/align]
[align=left]//定义一个自定义的样式对象[/align]
[align=left]style_table_3_6.AspTableStyleats=newstyle_table_3_6.AspTableStyle();[/align]
[align=left]ats.CellPadding=9;//设置样式属性[/align]
[align=left]ats.CellSpacing=9;[/align]
[align=left]ats.BorderColor=Color.Blue;[/align]
[align=left]WebCustomControl11.ApplyStyle(ats);//用自定义样式覆盖控件样式[/align]
[align=left]WebCustomControl11.Border=3;//定义控件本身的样式属性[/align]
[align=left]WebCustomControl11.Controls.Add(bt1);//添加子控件[/align]
[align=left]WebCustomControl11.Controls.Add(bt2);[/align]
[align=left]WebCustomControl11.Controls.Add(bt3);[/align]
[align=left]WebCustomControl11.Controls.Add(bt4);[/align]
[align=left]WebCustomControl11.Controls.Add(bt5);[/align]
[align=left]WebCustomControl11.Controls.Add(bt6);[/align]
[align=left]}[/align]
[align=left]为方便我将Button控件的创建都定义在该方法里了。[/align]
[align=left]下面看看运行结果吧(图3-9)[/align]
[align=center]3-9[/align]



在上面的例子中我们首先定义了一个样式类AspTableStyle,重写了几个基类的方法,这几个方法我们在上面已经介绍过了,具体的用法大家还要从代码中认真揣摩下。我们也重写了IsEmpty属性,我个人认为重写IsEmpty属性是判断自定义的样式属性是否被设置最简单的做法。
[align=left]在上面这个例子的最后我们还使用了RenderControl方法来显示子控件,关于该方法我们在上面没有提到,其实该方法是在Control类中定义的,RenderChildren方法中用到了该方法来显示控件的每一个子控件,关于该方法的用法就如上面的例子所示。[/align]
关于样式类的使用及如何创建自定义样式类我们就讲到这里为止了,下面我们会对控件开发相关的接口进行下介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: