很久没发文章了,今天发一篇写了半个多月的教程,限于篇幅无法发布到首页来,目录如下:
- 事件、事件处理程序概念
- 问题描述:一个需要较长时间才能完成的任务
- 高耦合的实现
- 事件模型的解决方案,简单易懂的 VB.NET 版本
- 委托(delegate)简介
- C# 实现
- 向“.NET Framework 类库设计指南”靠拢,标准实现
事件、事件处理程序概念
在面向对象理论中,一个对象(类的实例)可以有属性(property,获取或设置对象的状态)、方法(method,对象可以做的动作)等成员外,还有事件(event)。所谓事件,是对象内部状态发生了某些变化、或者对象做某些动作时(或做之前、做之后),向外界发出的通知。打个比方就是,对象“张三”肚子疼了,然后他站在空地上大叫一声“我肚子疼了!”事件就是这个通知。
那么,相对于对象内部发出的事件通知,外部环境可能需要应对某些事件的发生,而做出相应的反应。接着上面的比方,张三大叫一声之后,救护车来了把它接到医院(或者疯人院,呵呵,开个玩笑)。外界因应事件发生而做出的反应(具体到程序上,就是针对该事件而写的那些处理代码),称为事件处理程序(event handler)。
事件处理程序必须和对象的事件挂钩后,才可能会被执行。否则,孤立的事件处理程序不会被执行。另一方面,对象发生事件时,并不一定要有相应的处理程序。就如张三大叫之后,外界环境没有做出任何反应。也就是说,对象的事件和外界对该对象的事件处理之间,并没有必然的联系,需要你去挂接。
在开始学习之前,我希望大家首先区分“事件”和“事件处理程序”这两个概念。事件是隶属于对象(类)本身的,事件处理程序是外界代码针对对象的事件做出的反应。事件,是对象(类)的设计者、开发者应该完成的;事件处理程序是外界调用方需要完成的。简单的说,事件是“内”;事件处理程序是“外”。
了解以上基本概念之后,我们开始学习具体的代码实现过程。因为涉及代码比较多,限于篇幅,我只是将代码中比较重要的部分贴在文章里,进行解析,剩余代码还是请读者自己查阅,我已经把源代码打了包提供下载。我也建议你对照这些源代码,来学习教程。[下载本教程的源代码]
……(更多、更详细内容请点击目录中的链接)……
欢迎大家批评指教!如希望转载,请务必参照本人blog公告内的声明!
打印 | 张贴于 2005-01-22 18:51:00 | Tag:暂无标签
留言反馈
private void button1_Click(object sender, System.EventArgs e)
{
statusBar1.Text = "开始工作 ....";
this.Cursor = Cursors.WaitCursor;
long tick = DateTime.Now.Ticks;
Worker worker = new Worker();
worker.RateReport += new Worker.RateReportEventHandler(this.worker_RateReport);
worker.DoLongTimeTask();
tick = DateTime.Now.Ticks - tick;
TimeSpan ts = new TimeSpan(tick);
this.Cursor = Cursors.Default;
statusBar1.Text = String.Format("任务完成,耗时 {0} 秒。", ts.TotalSeconds);
}
我做如此更改后,速度变得很慢,是何原因?
private void button1_Click(object sender, System.EventArgs e)
{
statusBar1.Text = "开始工作 ....";
this.Cursor = Cursors.WaitCursor;
long tick = DateTime.Now.Ticks;
Thread t = new Thread(new ThreadStart(DoLong));
t.Start();
tick = DateTime.Now.Ticks - tick;
TimeSpan ts = new TimeSpan(tick);
this.Cursor = Cursors.Default;
statusBar1.Text = String.Format("任务完成,耗时 {0} 秒。", ts.TotalSeconds);
}
private void DoLong()
{
Worker worker = new Worker();
worker.RateReport += new Worker.RateReportEventHandler(this.worker_RateReport);
worker.DoLongTimeTask();
}
一直有个疑惑,想请你您帮忙解答。
我现在有一个页面a.aspx,里面有一个复合的用户控件,用户控件里面有一个LinkButton,我想要鼠标点击这个button后能触发用户控件中的一个自定事件,如下代码所示:
'定义一个事件
Public Event ItemSelected As EventHandler
Private Sub LinkButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
'触发事件
RaiseEvent ItemSelected(Me, e)
End Sub
然后在a.aspx的后台代码中捕获这个事件,并给相关处理程序处理,但结果没法在a.aspx页中没法捕获到,请问在a.aspx要怎样设置才能处理这个事件?
请用VB代码解答,非常感谢!!
真有恒心啊!
我有一个朋友最近也学C#,这个对他会很有作用.