写这个只是为了自己以后要用的时候不会忘记 有一个可以找到代码的地方
以前 写自定义控件 一般只是为了显示一些东西 所以一般只重写 Render 方法就可以
今天想研究一下自定义按钮 发现原来的功能不够了 不能触发回调方法
看了一些别人的代码 大概的明白了
自定义Button类
代码using System;
using System.ComponentModel;
using System.Text;
using System.Web.UI;
namespace Test
{
[DefaultEvent("Click"), DefaultProperty("Text"), ToolboxData("<{0}:Button runat=server></{0}:Button>")]
public class Button : System.Web.UI.WebControls.WebControl,IPostBackEventHandler
{
public event EventHandler Click1;
string str = "123";
public event EventHandler bs;
protected override void Render(HtmlTextWriter writer)
{
StringBuilder sb = new System.Text.StringBuilder();
writer.Write("<span><a href=\"javascript:void(0);\" style=\"BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 10px; BACKGROUND-POSITION: 1px 1px; BORDER-TOP: #cccccc 1px solid; DISPLAY: inline-block; PADDING-LEFT: 10px; FONT-WEIGHT: bold; FONT-SIZE: 12px; PADDING-BOTTOM: 3px; MARGIN: 1px; BORDER-LEFT: #cccccc 1px solid; CURSOR: pointer; COLOR: #333333; LINE-HEIGHT: normal; PADDING-TOP: 3px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: Arial, Helvetica; WHITE-SPACE: nowrap; BACKGROUND-COLOR: #eeeeee; TEXT-DECORATION: none\" id=\"" + this.UniqueID + "\"");
sb.Append(Page.ClientScript.GetPostBackEventReference(this, "") + ";"); //用__doPostBack来提交,保证按钮的服务器端click事件执行
writer.WriteAttribute("onclick", sb.ToString());
writer.Write(">按钮"+str+"</a></span> ");
}
protected override System.Collections.IDictionary GetDesignModeState()
{
return base.GetDesignModeState();
}
//Invoke delegates registered with the Click event.
protected virtual void OnClick(EventArgs e) {
if (Click1 != null)
{
Click1(this, e);
}
if (bs != null)
{
bs(this, e);
}
}
protected override void OnInit(EventArgs e)
{
str = "看看";
base.OnInit(e);
}
#region IPostBackEventHandler 成员
public void RaisePostBackEvent(string eventArgument)
{
OnClick(new EventArgs());
}
#endregion
}
}
.aspx页面
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register Assembly="Test" Namespace="Test" TagPrefix="t" %> <!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> <t:Button runat="server" OnClick1="Button1_Click" Onbs="Button2_Click" /> </div> </form> </body> </html>
这里主要是明白了一点 自定义控件中想要多实现一种事件 只要到类中多定义一个 event参数就行 public event EventHandler bs;
然后对应的页面上的控件事件为 On+event参数的名称
IPostBackDataHandler 接口的 LoadPostData回调方法执行的条件是一定要存在一个 name=" + this.UniqueID + " 的控件