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

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

源码下载

4 使用自定义样式

在上一节中,我们通过集成TableStyle完成了RegistControlStyle类。现在我们需要在RegisterControl中使用自定义的RegistControlStyle。

使用自定义样式,首先复写RegistControl的CreatedControlStyle()方法,代码如下所示:

protected override Style CreateControlStyle()

{

return new RegisterControlStyle(this.ViewState);

}

为什么需要复写CreatedControlStyle属性呢?因为RegisteControl继承与WebControl,所有拥有ControlStyle属性。在WebControl基类中,ControlStyle属性的源代码如下所示:

private Style controlStyle;

 

public Style ControlStyle

{

get

{

if (this.controlStyle == null)

{

this.controlStyle= this.CreateControlStyle();

}

return this.controlStyle;

}

}

由于自定义控件的ControlStyle属性是通过CreatedControlStyle方法创建的,所以我们需要复写CreatedControlStyle方法,覆盖原有的ControlStyle属性。

现在还需要复写AddAttributeToRender方法,代码如下所示:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]

protected override void AddAttributesToRender(HtmlTextWriter writer)

{

base.AddAttributesToRender(writer);

 

writer.AddAttribute(HtmlTextWriterAttribute.Id,this.ClientID);

writer.AddAttribute(HtmlTextWriterAttribute.Accesskey,this.AccessKey);

 

 

if (!this.Enabled)

{

writer.AddAttribute(HtmlTextWriterAttribute.Disabled,"disabled");

}

 

writer.AddAttribute(HtmlTextWriterAttribute.Tabindex,this.TabIndex.ToString());

writer.AddAttribute(HtmlTextWriterAttribute.Title,this.ToolTip.ToString());

 

this.ControlStyle.AddAttributesToRender(writer,this);

 

IEnumerator item = this.Attributes.Keys.GetEnumerator();

while (item.MoveNext())

{

string key = item.Current.ToString();

writer.AddAttribute(key,this.Attributes[key]);

}

}

公开所有我们需要使用的自定义控件的样式属性,代码如下所示:

public virtual BackImageRepeat BackImageRepeat

{

get

{

RegisterControlStyle rs = this.ControlStyle as RegisterControlStyle;

return rs.BackImageRepeat;

}

set

{

RegisterControlStyle rs = this.ControlStyle as RegisterControlStyle;

rs.BackImageRepeat = value;

}

}

 

public new BorderStyle BorderStyle

{

get { return (this.ControlStyle as RegisterControlStyle).BorderStyle; }

set { (this.ControlStyle as RegisterControlStyle).BorderStyle = value; }

}

 

public new System.Web.UI.WebControls.Unit BorderWidth

{

get { return (this.ControlStyle as RegisterControlStyle).BorderWidth; }

set { (this.ControlStyle as RegisterControlStyle).BorderWidth = value; }

}

 

 

public int CellPadding

{

get { return (this.ControlStyle as RegisterControlStyle).CellPadding; }

set { (this.ControlStyle as RegisterControlStyle).CellPadding = value; }

}

 

public int CellSpacing

{

get { return (this.ControlStyle as RegisterControlStyle).CellSpacing; }

set { (this.ControlStyle as RegisterControlStyle).CellSpacing = value; }

}

 

public string BackImageUrl

{

get { return (this.ControlStyle as RegisterControlStyle).BackImageUrl; }

set { (this.ControlStyle as RegisterControlStyle).BackImageUrl = value; }

}

注意:所有的自定义样式都需要在自定义控件中进行公开,才能被设计器识别。特别需要注意的是,基于自定义样式的属性都要进行转换并且来自于ControlStyle属性。

修改RenderBeginTag()方法,以便使用所有我们公开的自定义控件样式属性。代码如下所示:

public override void RenderBeginTag(HtmlTextWriter writer)

{

writer.RenderBeginTag(HtmlTextWriterTag.Table);

writer.AddAttribute(HtmlTextWriterAttribute.Id,"RegisterTable");

writer.AddStyleAttribute(HtmlTextWriterStyle.Width,"auto");

writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "auto");

writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor,System.Drawing.ColorTranslator.ToHtml(this.BackColor));

 

writer.AddStyleAttribute(HtmlTextWriterStyle.BorderColor, System.Drawing.ColorTranslator.ToHtml(this.BorderColor));

writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle,this.BorderStyle.ToString());

writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth,this.BorderWidth.ToString());

writer.AddAttribute("cellpadding",this.CellPadding.ToString());

writer.AddAttribute("cellspacing", this.CellSpacing.ToString());

writer.AddStyleAttribute(HtmlTextWriterStyle.FontFamily,this.ControlStyle.Font.Name);

writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundImage, (this.ControlStyle as RegisterControlStyle).BackImageUrl);

writer.AddStyleAttribute(this.BackImageRepeat.ToString(),this.BackImageRepeat.ToString());

}

现在我们重新生成解决方案,重新再页面上拖入RegistControl,设定样式属性,效果如图4.1所示:

图4.1 使用自定样式属性控制自定义控件样式

源码下载

posted @ 2009-04-25 17:03  hongbo0521  阅读(2930)  评论(2编辑  收藏  举报