怎样编写简单的Web Custom Control 作者:Robert 联系方式:[email protected]
Web Custom Control的函数调用序列图(本人根据调用过程自制的序列图,有不对的地方望指正): 注意: 1、在序列图的区域(1)中的函数执行顺序是不能确定的。 2、区域(2)内的函数是当第一次用到内部的子控件时就会调用到该区域内的函数,用来保证在调用子控件之前已把子控件初始化了;另外,一定要注意到CreateChildrenControls函数,在调用过程中,如果不控制ChildrenControlsCreated变量,则系统会保证只执行一次(即调用多次EnsureChildControls函数,CreateChildrenControls也只会调一次,因为当调用一次后,ChildrenControlsCreated被设为true,以后执行EnsureChildControls就不会调用到CreateChildrenControls函数了)。 3、在SaveViewState函数的下面千万不要对ViewState赋值,因为系统在SaveViewState函数内把ViewState中的值写入(序列化)到Page中去了,如果在该函数之后更改了ViewState变量,则值是不会被序列化的。 4、INamingContainer指示接口的作用:上面没有标出,该接口可以使在CreateChildrenControls中创建的子控件具有保持PostBackData值的效果。比如:在CreateChildrenControls内有下面一段代码: TextBox m_text= new TextBox();m_text.Text="Test"; m_text.AutoPostBack= true; this.Controls.Add(m_text); base.CreateChildControls ();第一次执行的时m_text内的值是“Test”,当用户在界面中把该文本框的值改为“Secord”以后,如果该自定义web控件实现了INamingContainer接口,Post back后值仍然是“Secord”,如果没有实现该接口,则值为“Test”(我只注意到这个差别,大家可以试一下,找出其他的差别); 5、在编写Web Custom Control时,除LoadViewState,SaveViewState这两个地方用使用ViewState进行序列化和反序列化外,其他的地方最好用类的非公有变量代替,这样有几点好处:1、代码清晰(避免了即有ViewState又有变量,有时会使人糊涂);2、避免了多次类型转换;3、清楚明了的知道有几个变量被列化(当然这在写用户Web控件的时然也一样)。 6、如果要在Web Custom Control内引发事件的话(非子控件引发的事件),一定要实现IPostBackEventHandler接口,下段代码可以说明怎样引发事件: protected override void Render(HtmlTextWriter output){ output.Write("<a href=javascript:"+ this.Page.GetPostBackEventReference(this,"first")+">postback</a>");base.Render(output); } 这段代码会输入“postback”的一个链接,当点击时就会把内容提交到服务器,这时就可以在RaisePostBackEvent(string eventArgument)函数内接收事件了,其中eventArgument是与Page.GetPostBackEventReference的第二个参数相对应。
由于时间有限,对于其他的接口或功能希望大家自己体会。
下面有一段数据导行栏的代码做为参考。
//**************************************************************** /* namespace CustomerTest public delegate void DataBarClick(object e,int number); /// <summary> private bool m_Design=true;
/// <summary> /// <summary> set } /// <summary> } protected override void CreateChildControls() TableRow l_tbrow=new TableRow();//只有一行
l_tbcell=new TableCell();//建立"|"
l_tbcell=new TableCell();//建立"|" l_tbcell=new TableCell();//建立第三个列的内容
this.Controls.Add(l_table); base.CreateChildControls ();
if(this.databarClick!=null) /// <summary> /// <summary> //**********************************************************************************
测试码:
Test.aspx
<%@ Register TagPrefix="test" NameSpace="CustomerTest" Assembly="TestDataBar" %> <%@ Page language="c#" Codebehind="Test.aspx.cs" AutoEventWireup="false" Inherits="TestDataBar.Test" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Test</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"> <test:DataBar runat="server" id="stDBar"></test:DataBar> <FONT face="宋体"></FONT> </form> </body> </HTML> |
Test.aspx.cs
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 TestDataBar
{
/// <summary>
/// Summary description for Test.
/// </summary>
public class Test : System.Web.UI.Page
{
protected CustomerTest.DataBar stDBar;
private void Page_Load(object sender, System.EventArgs e)
{
if(!this.IsPostBack)
{
this.stDBar.TotalRecord=100;
this.stDBar.NumberPerPage=15;
this.stDBar.CurrentPage=1;
}
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.stDBar.databarClick += new CustomerTest.DataBarClick(this.stDBar_databarClick);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void stDBar_databarClick(object e, int number)
{
this.Response.Write("当前页是:第"+number.ToString()+"<br>");
this.Response.Write("总记录数是:"+this.stDBar.TotalRecord.ToString()+"<br>");
this.Response.Write("每页记录数是:"+this.stDBar.NumberPerPage.ToString()+"<br>");
}
}
}
本文地址:http://com.8s8s.com/it/it45230.htm