先说说几个教训:
1,小心命名,别跟系统已经存在的命名起冲突,比如,我一时疏忽将控件的命名空间设成Control,编译通过后,运行总是不通过,查了半天,才发现这个小问题,再比如,NAMEspace别和类名相同,否则,写起来很是不方便
下面是WEBTIMER的全部代码加了注解的
using System;
using System.Web.UI;
using System.Text;
using System.Web;
using System.Data;
using System.ComponentModel;
namespace MyControl
{
/// <summary>
/// WebTimer 的摘要说明。
/// </summary>
///Designer属性指定一个类作为设计时类,该类必须派生于ControlDesigner类,并且实现GetDesignHtml方法
///Designer性性是System.ComponentModel空间的类
///WebTimer继承了IPostBackEventHandler是因为任何要利用POSTBACK机制来进行事件处理的控件都必须
///继承该接口并实现RaisePostbackEvent方法
[Designer(typeof(MyControl.WebTimerDesigner))]
public class WebTimer:System.Web.UI.Control,System.Web.UI.IPostBackEventHandler
{
成员变量定义
属性定义
事件定义
方法定义
IPostBackEventHandler 成员
OnRender方法用来输出HTML
OnPreRender方法用来产生HTML
}
}
using System.Web.UI;
using System.Text;
using System.Web;
using System.Data;
using System.ComponentModel;
namespace MyControl
{
/// <summary>
/// WebTimer 的摘要说明。
/// </summary>
///Designer属性指定一个类作为设计时类,该类必须派生于ControlDesigner类,并且实现GetDesignHtml方法
///Designer性性是System.ComponentModel空间的类
///WebTimer继承了IPostBackEventHandler是因为任何要利用POSTBACK机制来进行事件处理的控件都必须
///继承该接口并实现RaisePostbackEvent方法
[Designer(typeof(MyControl.WebTimerDesigner))]
public class WebTimer:System.Web.UI.Control,System.Web.UI.IPostBackEventHandler
{
成员变量定义
属性定义
事件定义
方法定义
IPostBackEventHandler 成员
OnRender方法用来输出HTML
OnPreRender方法用来产生HTML
}
}
相应的Designer
using System;
using System.Web.UI;
using System.Web.UI.Design;
using System.Text;
namespace MyControl
{
/// <summary>
/// WebTimerDesigner 的摘要说明。
/// </summary>
public class WebTimerDesigner:System.Web.UI.Design.ControlDesigner
{
public override string GetDesignTimeHtml()
{
StringBuilder HtmlBuilder=new StringBuilder();
Control TimerControl=(Control)this.Component;
if(TimerControl is MyControl.WebTimer)
{
HtmlBuilder.AppendFormat("<span id=\"{0}\" style=\"border:1px solid #666666;font-size:9pt;font-weight:bold\" >{1}</span>",new object[]{TimerControl.ClientID,"WebTimer"});
}
return(HtmlBuilder.ToString());
}
}
}
using System.Web.UI;
using System.Web.UI.Design;
using System.Text;
namespace MyControl
{
/// <summary>
/// WebTimerDesigner 的摘要说明。
/// </summary>
public class WebTimerDesigner:System.Web.UI.Design.ControlDesigner
{
public override string GetDesignTimeHtml()
{
StringBuilder HtmlBuilder=new StringBuilder();
Control TimerControl=(Control)this.Component;
if(TimerControl is MyControl.WebTimer)
{
HtmlBuilder.AppendFormat("<span id=\"{0}\" style=\"border:1px solid #666666;font-size:9pt;font-weight:bold\" >{1}</span>",new object[]{TimerControl.ClientID,"WebTimer"});
}
return(HtmlBuilder.ToString());
}
}
}
调用页面的HTML
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="TimerDemo.WebForm1" %>
<%@ Register TagPrefix="cc1" Namespace="MyControl" Assembly="MyControl.WebTimer" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<cc1:WebTimer id="WebTimer1" runat="server"></cc1:WebTimer>
</form>
</body>
</HTML>
<%@ Register TagPrefix="cc1" Namespace="MyControl" Assembly="MyControl.WebTimer" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<cc1:WebTimer id="WebTimer1" runat="server"></cc1:WebTimer>
</form>
</body>
</HTML>
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace TimerDemo
{
/// <summary>
/// WebForm1 的摘要说明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected MyControl.WebTimer WebTimer1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}
Web 窗体设计器生成的代码
private void WebTimer1_Timer(object sender, System.EventArgs e)
{
Response.Write(DateTime.Now);
}
}
}
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace TimerDemo
{
/// <summary>
/// WebForm1 的摘要说明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected MyControl.WebTimer WebTimer1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}
Web 窗体设计器生成的代码
private void WebTimer1_Timer(object sender, System.EventArgs e)
{
Response.Write(DateTime.Now);
}
}
}