2012-04-25 23:14:40|?次阅读|上传:wustguangh【已有?条评论】发表评论
上面的例子并不能体现委托和事件的优点,其实,委托和事件在C#中使用非常广泛,例如,当我们点击某个“按钮”的时候,就会有一个“Click”事件触发,而这个事件会通知“委托”,在C#窗体应用程序中,“委托”的名字比较规范,统一使用“EventHandler”,它的具体格式是“void EventHandler(object sender, EventArgs e);”。相信大家都写过下面这样子的HelloWorld程序:
当点击按钮的时候弹出一个对话框。我们怎样实现的呢?你肯定会说,我们在设计窗口双击按钮,就会自动为我们生成类似如下的方法:
private void button1_Click(object sender, EventArgs e) { MessageBox.Show("我被点击了......"); }
其实,这里用到的就是事件和委托,这里的button1_Click就是符合EventHandler委托规矩的一个具体的方法,即返回值为void,参数分别是一个object和EventArgs。
我们可以在Form1.Designer.cs中看到如下代码:
this.button1.Click += new System.EventHandler(this.button1_Click);
可以看到,这里有一个Click事件,然后将一个委托实例附加到这个事件上,跟我们前面讲的控制台应用程序中的用法是完全一样的。那这个Click事件是怎么触发的呢?对于这些系统类的事件,并不用我们管。
当然,我们也可以定义自己的事件和委托,例如我定义一个事件,这个事件就是输出对象的名字。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Test5 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("我被点击了……"); btnClick += ShowButtonName; btnClick(sender); } // 新增事件和委托 private delegate void ShowName(object sender); private event ShowName btnClick; private void ShowButtonName(object sender) { Button btn = sender as Button; if (btn != null) { MessageBox.Show("按钮的名称是:" + btn.Text); } } } }
我们这里定义了一个ShowName委托和一个btnclick事件。并且,在button1_Click()方法中触发这个btnclick事件。最后的结果是,当我们点击按钮的时候,首先弹出一个“我被点击了!!!”的对话框,然后确定之后再弹出另一个显示按钮名称的对话框: