大家都有这样的经历:
  打开VS--〉新建应用程序(FORM1)--〉往里面挪按钮--〉双击按钮--〉写代码
  这看上去那么的自然,简单,可仔细想一下,窗口(FORM1)是一个类,按钮(Button)是另一个类,FORM1怎么知道按钮点击了?
  
  仔细看看代码,发现有如下代码:

1
2this.button1.Click += new System.EventHandler(this.button1_Click);
3
4
5private void button1_Click(object sender, System.EventArgs e)
6        {
7        
8        }

  难道这就是传说中的事件委托?@_@
  button1的Click事件在Form1中注册了button1_Click这个方法,所以当button1点击的时候程序执行到了button1_Click下面。

  我对这个过程模拟了程序,

 1using System;
 2
 3/**//// <summary>
 4/// 按钮类
 5/// </summary>
 6class Button
 7{
 8    /**//// <summary>
 9    /// 传送给点击事件接收者的一些信息
10    /// </summary>
11    public class ButtonEventArgs:EventArgs
12    {
13        public string buttonId;
14        public ButtonEventArgs(string buttonId)
15        {
16            this.buttonId = buttonId;
17        }
18    }
19    
20    //定义的委托
21    public delegate void ButtonEventHandler(object sender,ButtonEventArgs args);
22
23    //事件成员
24    public event ButtonEventHandler Click;
25
26    //假设用户点击按钮可以直接进入这个方法,
27    public void UserClick(string buttonId)
28    {
29        ButtonEventArgs e = new ButtonEventArgs(buttonId);
30        Console.WriteLine("我是按钮({0})",e.buttonId);
31        OnClick(e);
32    }          
33 
34    //该方法通知到事件登记对象(Click就想个变量,它指向了事件登记对象的回调方法,既Page里的On_Click)
35    protected virtual void OnClick(ButtonEventArgs e)
36    {
37        if(Click != null)
38        {
39            Click(this,e);
40        }
41    }
42}
43
44class Form1
45{
46    //登记Button的Click事件
47    public Form1(Button btn)
48    {
49        btn.Click += new Button.ButtonEventHandler(On_Click);
50    }
51
52    //这个方法可以撤销Button的Click事件
53    public void Unregister(Button btn)
54    {
55        Button.ButtonEventHandler callback = new Button.ButtonEventHandler(On_Click);
56        btn.Click -= callback;
57    }
58
59    public void On_Click(object sender,Button.ButtonEventArgs e)
60    {
61        Console.WriteLine("\n按钮:{0}已经被点击,将发生些事情.",e.buttonId);
62    }
63
64    /**//// <summary>
65    /// 程序入点
66    /// </summary>
67    public static void Main()
68    {
69        Button btn = new Button();
70        Form1 frm = new Form1(btn);
71        btn.UserClick("btnNo4");
72    }
73}

运行结果:
我是按钮(btnNo4)
按钮:btnNo4已经被点击,将发生些事情....

可以看出在Form1的构造中登记了Button的Click事件并将邦定到了Form1的On_Click方法中,Form1就可以不用关,Button中的点击到底是怎么实现的。

转载于:https://www.cnblogs.com/QiuYun/archive/2007/09/01/877926.html

浅谈.net事件机制相关推荐

  1. [转]浅谈MS-SQL锁机制

    本文转自:http://study.99net.net/study/database/mssql/1085625420.html 浅谈MS-SQL锁机制 2004-05-27     锁的概述 一. ...

  2. 【浅谈DOM事件的优化】

    浅谈DOM事件的优化 在 JavaScript 程序的开发中,经常会用到一些频繁触发的 DOM 事件,如 mousemove.resize,还有不是那么常用的鼠标滚轮事件:mousewheel (在 ...

  3. 浅谈HTTPS通信机制和Charles抓包原理-by:nixs

    转载请注明出处:https://blog.csdn.net/zwjemperor/article/details/80719427 主页:https://blog.csdn.net/zwjempero ...

  4. 浅谈Java多线程机制

    浅谈Java多线程机制 (-----文中重点信息将用红色字体凸显-----) 一.话题导入 在开始简述Java多线程机制之前,我不得不吐槽一下我国糟糕的IT界技术分享氛围和不给力的互联网技术解答深度. ...

  5. 浅谈DOMContentLoaded事件及其封装方法

    我们在开发时,经常需要检测页面是否加载完毕,以确保脚本安全运行,下面我们就来浅谈一下检测页面是否加载完毕的那些事件们. 1. onload 事件 在页面的所有资源加载完成时,window对象上会触发一 ...

  6. 浅谈Android事件分发机制

    在Android实际开发过程中经常会遇到View之间的滑动冲突,如ScrollView与Listview.RecyclerView之间的嵌套使用.在很好的解决此类问题之前,我们应深入的了解Androi ...

  7. 浅谈 js运行机制 、宏观任务、微观任务

    **今天我们谈一下我对js 运行机制 和宏观任务.微观任务的理解** js运行机制有同步运行和异步运行 js是单线程运行模式在进入任务当中如果是同步任务 那么就直接被主线程运行 如果是异步任务 那么就 ...

  8. 安卓开发必须会的技能!浅谈Android消息机制原理,威力加强版

    目录 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样. PagerAdapter 介绍 ViwePager 缓存策略 ViewPager 布局处 ...

  9. 浅谈Linux epoll机制

    前言 概述 epoll是一种当文件描述符的内核缓冲区非空的时候,发出可读信号进行通知,当写缓冲区不满的时候,发出可写信号通知的机制: 关键函数 int epoll_create(int size);创 ...

最新文章

  1. html 逗号用什么替换,字符串用javascript数组中的逗号替换“↵”
  2. Vue全局路由侦听beforeEach路由守卫附代码使用示例
  3. 初步了解OpenSSL命令
  4. MFC通过URL下载并保存文件代码 转载
  5. windows下使用docker(一)—— 安装
  6. java json 修改字段_JSON文件-Java:编辑/更新字段值
  7. 数学难题html5小游戏答案,小学数学难题讲解及答案
  8. 火星人(洛谷P1088题题解,C++语言描述)
  9. redis shell命令
  10. selenium-js
  11. css设置文本(上下)居中显示
  12. 武汉理工大学 计算机学院院长,熊盛武:武汉理工大学计算机科学与技术学院院长、教授...
  13. vue关闭eslint语法检查
  14. 我的爬虫 之 爬今日头条街拍图片
  15. 图解HTTP----web的攻击技术
  16. eterm和easyfare的官网地址
  17. C/C++家族族谱管理系统
  18. 使用redis 作为计数器
  19. springboot读取json文件并存入数据库
  20. python的pip如何更新到最新版本

热门文章

  1. 几个商业模式的运用手法
  2. 从2019年开始,越来越多的人关注“副业”这个词
  3. 多数人只有一种工资收入,想赚更多钱,只有去做副业
  4. 大家都在讲大数据,大数据是什么呢?
  5. Golang实现Server和Client的TCP通讯
  6. 在线索二叉树中找前驱后继
  7. hashmap hashtable concurrenthashmap区别
  8. ssis工具_SSIS中的DTExec实用工具概述
  9. 使用PowerShell和Windows任务计划程序备份Linux SQL Server数据库
  10. ssis行计数变量_SSIS服务性能计数器指南