当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET 自定义控件从入门到精通3

ASP.NET
如何在ASP.NET中使用SmtpMail发送邮件
在VB.NET中利用Split和Replace函数计算字数
Attribute应用:简化ANF自定义控件初始化过程
ASP.NET 2.0移动开发入门之使用样式
ASP.NET 2.0中使用OWC生成图表
ASP.NET 2.0中控件的简单异步回调
一个无法捕获ADO.NET Dataset的内存错误
深入解读ADO.NET2.0的十大最新特性
.Net平台下的分布式缓存设计
ASP.NET全局异常处理浅析
ASP.NET 2.0中文验证码的实现
浅析.NET平台编程语言的未来走向
.net 框架程序设计收藏
使用ASP.NET MVC Futures 中的异步Action
详解.NET中的XmlReader与XmlWriter
关于.NET中的Server push技术
asp.net页面执行机制
对比JSP和ASP.NET的存储过程
.NET 4.0不会包含System.Shell.CommandLine
ASP.NET十个有效性能优化的方法

ASP.NET 自定义控件从入门到精通3


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 56 ::
收藏到网摘: n/a

3 状态管理和Style类

3.3 开发自定义的Style类

在上一节中,我们讲到了Style类的属性和方法。但是Style类本身并没有提供全面的CSS样式属性的支持。我们需要继承Style类或Style类的子类,才能支持我们想要的CSS样式属性。

首先我们分析我们现在所写的Register控件的主要布局格式即Table布局,那么我们只需要继承与Style类的子类TableStyle类就可以获取Table的样式控制。

首先我们先来添加一个新类,类名为:RegisterControleStyle。首先为RegisterControleStyle类提供无参构造函数RegisterControleStyle()。然后在提供以下代码中的构造函数:

以下为引用的内容:

using System;

using System.Collections.Generic;

using System.Text;

using System.ComponentModel;

using System.Text;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

namespace RegisterControl

{

public enum BackImageRepeat

{

Repeat,RepeatX,RepeatY,NoRepeat,Inherit

}

 

public class RegisterControlStyle : TableStyle

{

public RegisterControlStyle()

{ }

 

public RegisterControlStyle(StateBag viewState)

: base(viewState)

{

 

}

}

}

注意:在这里的第二个构造函数传递了一个StateBag类型的参数,并调用了基类的构造函数。

我们仔细观察RegisterControleStyle类的构造函数的第二种重载形式,我们将实例化RegisterControleStyle对象是传递的ViewState传给了父类。为什么要这么做??聪明的园友一定知道了,呵呵 让父类的样式属性也保存在当前自定义控件的ViewState中。

在自定义控件中,还需要公开一些当前自定义控件的特定属性,本例中我们定义一个背景图片重复的枚举:

以下为引用的内容:

public enum BackImageRepeat

{

Repeat,RepeatX,RepeatY,NoRepeat,Inherit

}

现在我们在RegisterControleStyle类中添加一个公共属性BackImageRepeat,BackImageRepeat属性是我们刚才定义的枚举类型的。代码如下所示:

以下为引用的内容:

public BackImageRepeat BackImageRepeat

{

get

{

if (this.ViewState["BackImageRepeat"] != null)

{

return (BackImageRepeat)this.ViewState["BackImageRepeat"];

}

return BackImageRepeat.NoRepeat;

}

set

{

this.ViewState["BackImageRepeat"] = value;

}

}

注意:所有自定义控件的强类型样式属性必须使用ViewState集合作为内部存储,否则页面将无法获取该样式属性。

我们还需要提供一个判断开发者是否设定了CSS样式属性的方法IsSetCssAtt(),代码如下所示:

以下为引用的内容:

internal virtual bool IsSetCssAtt(string key)

{

return this.ViewState[key] != null;

}

现在我们来复写基类中判断样式属性是否设置的属性IsEmpty,代码如下所示:

public override bool IsEmpty

{

get

{

return base.IsEmpty && !IsSetCssAtt("BackImageRepeat");

}

}

自定义Style类复写IsEmpty属性,首先需要判断基类中的样式属性是否已经设定了,然后再判断子类中的样式属性受否已经被设定。

通过复写IsEmpty属性,我们可以迅速的知道自定义CSS样式属性是否已经设定了。

所有的自定义Style类都必须复写Reset()方法,以移除添加到ViewState中的属性项。Reset()方法代码如下:

以下为引用的内容:

/// <summary>

/// 用于重新设定属性时调用的方法

/// </summary>

public override void Reset()

{

//首先重设基类属性

base.Reset();

//当前所有属性为空时 直接返回

if (IsEmpty)

return;

 

//如果设定了自定义样式属性

if (IsSetCssAtt("BackImageRepeat"))

//移除自定义样式属性,防止繁复覆盖

this.ViewState.Remove("BackImageRepeat");

}

在Style类中定义了一个虚方法,用以呈现每一个枚举样式。重写FillStyleAttributes()方法代码如下所示:

以下为引用的内容:

protected override void FillStyleAttributes(CssStyleCollection attributes, IUrlResolutionService urlResolver)

{

base.FillStyleAttributes(attributes, urlResolver);

 

if (this.IsSetCssAtt("BackImageRepeat"))

{

attributes.Add("background-repeat",this.GetBackImageRepeat(this.BackImageRepeat));

}

}

 

/// <summary>

/// 通过自定义枚举获取特定的CSS样式属性字符串

/// </summary>

/// <param name="b"></param>

/// <returns></returns>

protected virtual string GetBackImageRepeat(BackImageRepeat b)

{

switch (b)

{

case BackImageRepeat.Inherit:

return "";

case BackImageRepeat.NoRepeat:

return "no-repeat";

case BackImageRepeat.Repeat:

return "repeat";

case BackImageRepeat.RepeatX:

return "repeat-y";

case BackImageRepeat.RepeatY:

return "repeat-x";

default:

return "no-repeat";

}

}

注意:我们将自定义的枚举类型转化为CSS样式属性的值字符串,然后在添加至样式集合中。

现在我们来复写CopyForm()方法,以便将传入参数的Style对象赋值给相关的样式属性。代码如下所示:

以下为引用的内容:

public override void CopyFrom(Style s)

{

if (s == null)

return;

 

base.CopyFrom(s);

RegisterControlStyle rs = s as RegisterControlStyle;

if (rs == null || rs.IsEmpty)

return;

 

if (rs.IsSetCssAtt("BackImageRepeat"))

this.BackImageRepeat = rs.BackImageRepeat;

}

自定义Style类还需要重写接类的MergeWith()方法,目的是将传入的Style对象的样式属性和自己的样式属性合并。代码如下:

以下为引用的内容:

public override void MergeWith(Style s)

{

if (s == null)

return;

 

if (IsEmpty)

{

CopyFrom(s);

return;

}

 

RegisterControlStyle rs = s as RegisterControlStyle;

if (rs == null || rs.IsEmpty)

return;

if (rs.IsSetCssAtt("BackImageRepeat"))

this.BackImageRepeat = rs.BackImageRepeat;

 

}

在下一节中讲解如何使用我们的自定义Style类。