C#委托(delegate)和事件(event)具体用法

2012-04-25 23:14:40|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C#|来源:唯设编程网

二、在窗体中使用委托和事件

上面的例子并不能体现委托和事件的优点,其实,委托和事件在C#中使用非常广泛,例如,当我们点击某个“按钮”的时候,就会有一个“Click”事件触发,而这个事件会通知“委托”,在C#窗体应用程序中,“委托”的名字比较规范,统一使用“EventHandler”,它的具体格式是“void EventHandler(object sender, EventArgs e);”。相信大家都写过下面这样子的HelloWorld程序:

C#按钮例子

当点击按钮的时候弹出一个对话框。我们怎样实现的呢?你肯定会说,我们在设计窗口双击按钮,就会自动为我们生成类似如下的方法:

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事件。最后的结果是,当我们点击按钮的时候,首先弹出一个“我被点击了!!!”的对话框,然后确定之后再弹出另一个显示按钮名称的对话框:

 C#按钮测试程序C#事件与委托测试程序
<12>
发表评论0条 】
网友评论(共?条评论)..
C#委托(delegate)和事件(event)具体用法