写这个只是为了自己以后要用的时候不会忘记 有一个可以找到代码的地方

以前 写自定义控件 一般只是为了显示一些东西  所以一般只重写 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 + " 的控件

posted on 2010-08-26 16:13  skyzhou  阅读(387)  评论(1编辑  收藏  举报