ASP.NET 自定义控件从入门到精通(四)

原创|其它|编辑:郝浩|2009-04-27 09:45:04.000|阅读 701 次

概述:在编写自定义控件时,需要为页面开发人员提供设计器属性,便于他们设定控件的样式、外观。并且在提供设计器属性时,需要为这些设计器属性提供便于阅读的说明。使用设计器属性注释自定义控件的属性,可以提供该项功能。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

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 使用自定样式属性控制自定义控件样式


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP