WEBTIMER控件研究的心得:丢开书本做一个WebTimer
生活随笔
收集整理的這篇文章主要介紹了
WEBTIMER控件研究的心得:丢开书本做一个WebTimer
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先說說幾個教訓:
1,小心命名,別跟系統已經存在的命名起沖突,比如,我一時疏忽將控件的命名空間設成Control,編譯通過后,運行總是不通過,查了半天,才發現這個小問題,再比如,NAMEspace別和類名相同,否則,寫起來很是不方便
下面是WEBTIMER的全部代碼加了注解的
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
????{
????????成員變量定義#region?成員變量定義
????????????private?int?_interval=5000;//計時器種子數
????????????private?bool?_enable=true;//是否允許此計時器
????????????private?static??object?TimerKey=new?object();//TimerKey是做什么用的呢,它是用來做Events的KEY對象的,而且它是靜態的,所以,對于類的所有實例,將只耗費一個變量的代價
????????#endregion
????????屬性定義#region?屬性定義
????????[Browsable(true),Bindable(true),DefaultValue(5000),Description("計時器使用的種子數")]
????????public?int?Interval
????????{
????????????set{_interval=value;}
????????????get{return(_interval);}
????????}
????????[Browsable(true),Bindable(true),DefaultValue(true),Description("是否允許計時器")]
????????public?bool?Enable
????????{
????????????get{return?_enable;}
????????????set{_enable=true;}
????????}
????????[Browsable(true),Bindable(true),DefaultValue(true),Description("是否輸出控件")]
????????public?override?bool?Visible
????????{
????????????get
????????????{return?base.Visible;}
????????????set
????????????{base.Visible?=?value;}
????????}
????????#endregion
????????事件定義#region?事件定義
????????public?event?EventHandler?Timer
????????{
????????????add?{Events.AddHandler(TimerKey,value);}
????????????remove{Events.RemoveHandler(TimerKey,value);}
????????}
????????#endregion
????????方法定義#region?方法定義
????????/**////?<summary>
????????///?這個私有方法是用來在引發POSTBACK事件后,調用事件處理的關鍵,它再調用相應的事件處理程序
????????///?</summary>
????????private??void?ProcessTimer(string?eventArgument)
????????{
????????????EventHandler?TimerHandler=(EventHandler)Events[TimerKey];
????????????if(TimerHandler!=null)
????????????????TimerHandler(this,EventArgs.Empty);
????????}
????????private?string?BuildJavascript()
????????{
????????????StringBuilder?JsBuilder=new?StringBuilder();
????????????JsBuilder.AppendFormat("<script?language='javascript'>setTimeout(\"{0}\",{1});</script>",new?object[]{Page.GetPostBackEventReference(this),Interval});
????????????return(JsBuilder.ToString());
????????}
????????#endregion
????????IPostBackEventHandler?成員#region?IPostBackEventHandler?成員
????????/**////?<summary>
????????///?每個要使用POSTBACK機制并且想在POSTBACK后進行適當處理的控件
????????///?必須實現IPostBackEventHandler的RaisePostBackEvent方法
????????///?并在此方法中調用或間接調用事件處理程序
????????///?</summary>
????????///?<param?name="eventArgument"></param>
????????public?void?RaisePostBackEvent(string?eventArgument)
????????{
????????????//?TODO:??添加?WebTimer.RaisePostBackEvent?實現
????????????ProcessTimer("");
????????}
????????#endregion
????????OnRender方法用來輸出HTML#region?OnRender方法用來輸出HTML
????????protected?override?void?Render(HtmlTextWriter?writer)
????????{
????????????if(Page!=null)
????????????????Page.VerifyRenderingInServerForm(this);
????????????if(_enable)
????????????????writer.Write(BuildJavascript());
????????}
????????#endregion
????????OnPreRender方法用來產生HTML#region?OnPreRender方法用來產生HTML
????????protected?override?void?OnPreRender(EventArgs?e)
????????{
????????????base.OnPreRender?(e);
????????????Page.GetPostBackEventReference(this,"");
????????????//發現這一句可以不加,如果見了的話呢,DOPOSTBACK將會被繪制在前面,否則,繪制在后面
????????}
????????#endregion
????????
????}
}
相應的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());
????????}????????
????}
}
調用頁面的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>
相應的代碼
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?窗體設計器生成的代碼#region?Web?窗體設計器生成的代碼
????????override?protected?void?OnInit(EventArgs?e)
????????{
????????????//
????????????//?CODEGEN:?該調用是?ASP.NET?Web?窗體設計器所必需的。
????????????//
????????????InitializeComponent();
????????????base.OnInit(e);
????????}
????????
????????/**////?<summary>
????????///?設計器支持所需的方法?-?不要使用代碼編輯器修改
????????///?此方法的內容。
????????///?</summary>
????????private?void?InitializeComponent()
????????{????
????????????this.WebTimer1.Timer?+=?new?System.EventHandler(this.WebTimer1_Timer);
????????????this.Load?+=?new?System.EventHandler(this.Page_Load);
????????}
????????#endregion
????????private?void?WebTimer1_Timer(object?sender,?System.EventArgs?e)
????????{
????????????Response.Write(DateTime.Now);
????????}
????}
}
轉載于:https://www.cnblogs.com/Heroman/archive/2004/11/29/70614.html
總結
以上是生活随笔為你收集整理的WEBTIMER控件研究的心得:丢开书本做一个WebTimer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在ASP.NET中把数据POST到其他页
- 下一篇: 我是一个程序员!