这个是我做的第三个例子,也是书上的第三个例子,我新建了一个叫MicMenu的web组件项目,修改默认cs文件为:MicMenuBar.cs,以下是按书上的代码录入的,有一些改动,因为我对这个代码进行了代码分析,按分析结果修改过,还有就是加了一些自己的理解,最后是我是在vs.net2005下学习的,书本是vs.net2003的
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;
using System.Security.Permissions;
[assembly: SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode = false)]
[assembly: CLSCompliant(true)]
namespace MicMenu
{
//本实例主要用于说明基于WebControl基类的呈现控件方法
[DefaultProperty("Text")]
[ToolboxData("<{0}:MicMenuBar runat=server></{0}:MicMenuBar>")]
public class MicMenuBar : System.Web.UI.WebControls.WebControl
{
#region 定义变量,并定义默认值
//这里定义的变量和自定义用户控件里的使用是完全一样的
private string text = "";
private string href = "";
private string fontfamily = "宋体";
private string fontsize = "12px";
private string width = "100%";
private string height = "";
private string target = "_self";
private bool displayPipe = true;
#endregion
#region 构造函数
//P25 ②定义类的构造函数public WebCustomControl():base(HtmlTextWriterTag.Div),此句说明该服务器控件是基于<Div>控件的
//基于<div>控件的意思,可以对应生成的html代码看到,就是指这个控件生成的html代码,是全部包含在<div></div>之间的
public MicMenuBar()
: base(HtmlTextWriterTag.Div)
{
}
#endregion
#region 定义属性
//设置属性访问上面定义的成员变量
[Description("该属性用于表示控件显示的文字内容")]
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
public string Text
{
get { return text; }
set { text = value; }
}
[Description("该属性用于表示控件显示的文字的超链接地址")]
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
public string Href
{
get { return href; }
set { href = value; }
}
[Description("该属性用于表示控件显示的文字的大小")]
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("12px")]
public string FontSize
{
get { return fontsize; }
set { fontsize = value; }
}
[Description("该属性用于表示控件显示的文字的字体")]
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("宋体")]
public string FontFamily
{
get { return fontfamily; }
set { fontfamily = value; }
}
[Description("该属性用于表示控件显示超链接的目标框架")]
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("_self")]
public string Target
{
get { return target; }
set { target = value; }
}
[Description("该属性用于表示控件是否显示分隔符")]
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("true")]
public bool DisplayPipe
{
get { return displayPipe; }
set { displayPipe = value; }
}
#endregion
//将自定义样式写入HTTP输出流中去
//这一段生成的样式,是直接加在控件上的,就是加在包含这个控件生成的所有html代码的那个<div>上
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
//定义控件div样式
writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, "#f1f1f1");
writer.AddStyleAttribute("white-space", "nowrap");
writer.AddStyleAttribute("border-top", "#999 1px solid");
writer.AddStyleAttribute("padding-bottom", "#999 1px solid");
writer.AddStyleAttribute("padding-top", "2px");
writer.AddStyleAttribute("width", width);
writer.AddStyleAttribute("height", height);
base.AddAttributesToRender(writer);
}
protected override void RenderContents(HtmlTextWriter writer)
{
//定义样式
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "10px");
writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, fontsize);
writer.AddStyleAttribute(HtmlTextWriterStyle.FontFamily, fontfamily);
writer.RenderBeginTag(HtmlTextWriterTag.Span);
//定义样式
writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "black");
writer.AddStyleAttribute(HtmlTextWriterStyle.TextDecoration, "none");
writer.AddStyleAttribute("border", "#f1f1f1 1px solid");
//writer.AddStyleAttribute("display", "block");
writer.AddStyleAttribute("padding-right", "6px");
writer.AddStyleAttribute("padding-left", "6px");
writer.AddStyleAttribute("padding-bottom", "2px");
writer.AddStyleAttribute("padding-top", "2px");
writer.AddAttribute("onmouseout", "this.style.cssText='color:black; text-decoration:none; border:#f1f1f1 1px solid; padding-right:6px; padding-left:6px; padding-bottom:2px; padding-top:2px;'");
writer.AddAttribute("onmouseover", "this.style.cssText='color:black; text-decoration:none; border:#999999 1px solid; padding-right:6px; padding-left:6px; padding-bottom:2px; padding-top:2px; background:#cccccc;'");
writer.AddAttribute(HtmlTextWriterAttribute.Href, href);
writer.AddAttribute(HtmlTextWriterAttribute.Target, target);
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.Write(text);
writer.RenderEndTag();
writer.RenderEndTag();
//定义分隔符及样式
if (displayPipe)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "#a9a9a9");
writer.AddStyleAttribute("font", "70%");
writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, fontsize);
writer.AddStyleAttribute(HtmlTextWriterStyle.FontFamily, fontfamily);
writer.AddStyleAttribute("padding-right", "3px");
writer.AddStyleAttribute("padding-left", "3px");
writer.RenderBeginTag(HtmlTextWriterTag.Span);
writer.Write("|");
writer.RenderEndTag();
}
else
{
writer.RenderBeginTag(HtmlTextWriterTag.Span);
writer.Write(" ");
writer.RenderEndTag();
}
//使用默认逻辑来呈现子控件
base.RenderContents(writer);
}
}
}
生成这个MicMenu后,就可以在别的网站里引用控件了,测试代码是这个:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="P19_RenderContents.aspx.cs" Inherits="P19_RenderContents" %>
<%@ Register Assembly="micMenu" Namespace="MicMenu" TagPrefix="cc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table id="table5" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<cc1:micmenubar id="MicMenuBar1" runat="server" text="微软中国" Href="http://localhost" DisplayPipe="True" Target="_blank"></cc1:micmenubar>
</td>
<td>
<cc1:micmenubar id="MicMenuBar2" runat="server" text="微软中国" DisplayPipe="True" Target="_blank"></cc1:micmenubar>
</td>
<td>
<cc1:micmenubar id="MicMenuBar3" runat="server" text="微软中国" DisplayPipe="True" Target="_blank"></cc1:micmenubar>
</td>
<td width="100%">
<cc1:micmenubar id="MicMenuBar4" runat="server" text="微软中国" DisplayPipe="True" Target="_blank"></cc1:micmenubar>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
P17
对这句话我做过测试,我把AddStyleAttribute方法写在RenderBeginTag后面,生成的控件是没有设置过CSS的,AddStyleAttribute方法就好像被注释了一样
P25
通过分析代码,可以明确实现WebCustomControl类的基本过程。
①定义局部变量并赋予默认值。
②定义类的构造函数public WebCustomControl():base(HtmlTextWriterTag.Div),此句说明该服务器控件是基于<Div>控件的。
③定义6个属性:Text、FontSize、FontFamily、Href、Target和displayPipe。
④重写AddAttributesToRender方法,将自定义样式写入HTTP输出流中。
⑤重写呈现控件的方法RenderContents,其中包括定义其他样式及客户端行为的内容。