Question:在KYC留言板中,在关闭留言窗口会,会重新刷新留言记录的sotre。这就用到了“子用户控件”状态发生的变化后,对父页面的进行某种操作。
委托,事件与代理
有event(事件),就有对事件发生的处理function(函数),而委托就是把两者紧密联系在一起的桥梁,当事件发生时,委托就会知道,这时委托就会把信息发给事件的处理函数,这样就把
二者联系在一起了,下面介绍整个过程的实现。
Delegate(委托),在程序中可以用来注册事件,对程序中的某种状态进行监视,如果发生后,会触发相应的事件操作。委托是用来把方法当作参数来传递的,委托的签名(参数)必须和所委托的方法一致。
步骤:
一:在子用户控件中定义一个Delegte,也就是定义委托的数据类型,
例:public delegate void ChangeBtTextHadler(object sender,AjaxEventArgs e);//定义委托
说明:这是定义一个返回类型为void,有两个参数的委托<注意:参数是由自己定义的>,这里只是定义了它的参数及数据类型,并没有对它进行任何的实例化;委托的定义和类相同,所以常常放在类的外面定义,不过,也可以放在类里定义,这就是“嵌套委托”,它的调用方式不相同。
二:在页面的类里面定义一个委托类型的事件。
例:public event ChangeBtTextHadler onHideWindow;//定义了ChangeBtTextHadler类型的委托事件。
说明:这里的onHideWindow就充当了事件代理的角色,而这里是窗体hind()事件,才是真正的被监听的事件。《也理解为委托才是代
三:产生事件,这里是窗体的hind()事件产生时,触发了onHindWindow的委托事件。
protected void window1_hide(object sender, AjaxEventArgs e)
{//产生事件,事件的监听
Coolite.Ext.Web.ParameterCollection myParam = new Coolite.Ext.Web.ParameterCollection();
myParam.Add(new Coolite.Ext.Web.Parameter("Type", "1"));
onHideWindow(this, new AjaxEventArgs(myParam));//参数与委托类型的参数一致
}
四:委托实例化后绑定到事件<委托就是把函数作参数传递>
protected void page_Init(object sender, EventArgs e)
{
Delegate_Control1.onHideWindow += new ChangeBtTextHadler(Change_Test);//委托实例化后绑定到事件,Change_Test函数就是事件的处理函数,注册事件的处理函数;从观察者
模式来看,这里是注册订阅者。<注意:事件的注册在父页面的初始化时进行,也就是这里的page_Init()函数>
}
五:写明处理函数:处理函数,在被监听的事件发生后,要进行的处理操作。
protected void Change_Test(object sender, AjaxEventArgs e)
{
if (btDelegate.Text == "委托的测试")
{
btDelegate.Text = "测试成功";
}
else
btDelegate.Text = "委托的测试";
}
关于delegate(委托)的详细说明
1:在委托的声明过程中,如上面所说,ChangeBtTextHadler表示委托的数据类型,它的返回为void,带有两个参数。
2:委托的实例化:还有一种委托的常用形式:就是不用代理只把函数作为参数来进行传递,对它进行实例化,就是与它自身签名对应的方法,也就是作为参数传递的方法。也就是上面的Change_Test()。
3:multicast委托,一个委托变量可以引用一系列的委托,在这一系列的委托中,每个委托都顺序地指向后续的委托,这样就形成了一个委托链,也就叫做:multicast委托。也就是说一个事件
的发生其实可以多个处理函数来进行处理,而每个处理函数就是委托链的一项。
2009-12-17