1.事件回發
Web 服务器控件创建的按钮的类型有三种:Button,LinkButton,ImageButton。三个控件都继承IPostBackEventHandler接口。
IPostBackEventHandler接口专门定义了处理回发事件的方法,说白了就是onclick事件,如果自定义控件需要处理回发事件,你就需要继承IPostBackEventHandler接口,然后实现接口的RaisePostBackEvent 方法,另外一个简单的方法就是直接继承Button控件就可以了.
RaisePostBackEvent方法用于处理窗体发送给服务器时引发的事件,方法中有一个参数eventArgument 表示要传递到事件处理程序的可选事件参数的 String
下面总结处理回发事件,必须要做的步骤
(1)继承并实现IPostBackEventHandler接口的RaisePostBackEvent方法
(2)为表单元素定义UniqueID,以与IPostBackEventHandler服务器控件的UniqueID相对应
相应实现代码如下
示例一:
namespace CustomControls
{
public class SuperButton1 : Control, IPostBackEventHandler
{
// 声明Click事件委托
public event EventHandler Click;
// 定义OnClick事件处理程序
protected virtual void OnClick(EventArgs e)
{
if (Click != null)
{
Click(this, e);
}
}
// 实现RaisePostBackEvent方法,处理回发事件
public void RaisePostBackEvent(string eventArgument)
{
OnClick(EventArgs.Empty);
}
protected override void Render(HtmlTextWriter output)
{
output.Write("<INPUT TYPE=submit name=" + this.UniqueID +
" Value='确定' />");
}
}
}
注:EventArgs.Empty表示没有事件数据的事件,等同于EventArgs类的构造函数,等同于new EventArgs()。
2.數據回發
判断旧值和新值的比较(比较数据),如果发生变化,则引发事件,数据回发就是实现这样的事件。
IPostBackDataHandler 接口定义 ASP.NET 服务器控件为自动加载回发数据而必须实现的方法。
LoadPostData 方法 根据服务器控件的状态由于回发而发生更改做出判断是否调用RaisePostDataChangedEvent 方法,返回true则调用(就是旧值和新值不同的时候)
RaisePostDataChangedEvent 方法用于引发任何更改事件
以下的例子实现了如同textbox的TextChanged事件
postDataKey表示控件内部数据的关键值,postCollection表示所有传入名称值的集合,其采用索引的方式来访问
using System;
using System.Web;
using System.Web.UI;
using System.Collections.Specialized;
using System.ComponentModel;
namespace CustomComponents
{
[ToolboxData("<{0}:Textbox1 runat=server></{0}:Textbox1>"),
DefaultProperty("Text")]
public class Textbox1 : Control, IPostBackDataHandler
{
public string Text
{
get
{
object text = ViewState["Text"];
if (text == null)
return string.Empty;
else
return (string)text;
}
set
{
ViewState["Text"] = value;
}
}
public bool LoadPostData(string postDataKey,
NameValueCollection postCollection)
{
string postedValue = postCollection[postDataKey];
//检查新旧数据
if (!Text.Equals(postedValue))
{
Text = postedValue;
return true;
//自动调用RaisePostDataChangedEvent()
}
else
return false;
//不发生变化
}
public void RaisePostDataChangedEvent()
{
OnTextChanged(EventArgs.Empty);
}
protected virtual void OnTextChanged(EventArgs e)
{
if (TextChanged != null)
TextChanged(this, e);
}
public event EventHandler TextChanged;
override protected void Render(HtmlTextWriter writer)
{
base.Render(writer);
Page.VerifyRenderingInServerForm(this);
writer.Write("<INPUT type=/"text/" name=/"");
writer.Write(this.UniqueID);
writer.Write("/" value=/"" + this.Text + "/" />");
}
}
}