写这个只是为了自己以后要用的时候不会忘记 有一个可以找到代码的地方
以前 写自定义控件 一般只是为了显示一些东西 所以一般只重写 Render 方法就可以
今天想研究一下自定义按钮 发现原来的功能不够了 不能触发回调方法
看了一些别人的代码 大概的明白了
自定义Button类
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
代码
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 + " 的控件