1、MouseEventHandler和EventHandler传递参数的局限性分析

开发过程中,特别是使用自定义控件时,常常需要对一个控件的click,mouseDown,mouseUp等事件的处理进行重新定义,以满足实际工程应用和要求。常用的方法如下:

  1. button1.Click -= new EventHandler(ButtonClick_Handler);
  2. button1.MouseUp -= new MouseEventHandler(ButtonUp_Handler);
  3. button1.Click += new EventHandler(ButtonClick_Handler);
  4. MouseUp += new MouseEventHandler(ButtonUp_Handler);

可以看到,这里是通过EventHandler和MouseEventHandler这两个委托来能click和mouseup赋值。

这两个委托的定义如下:

EventHandler:
.NET Framework 中的事件模型基于具有事件委托,该委托将事件与事件处理程序连接。引发事件需要两个元素:
标识对事件提供响应的方法的委托。
保存事件数据的类。

  1. public delegate void EventHandler(Object sender, EventArgs e);
  2. public event EventHandler NoDataEventHandler;

MouseEventHandler:
表示将处理窗体、控件或其他组件的 MouseDown、MouseUp 或 MouseMove 事件的方法。
委托的原型:

  1. public delegate void MouseEventHandler(
  2. Object sender,
  3. MouseEventArgs e
  4. )

这两个委托都有两个参数,其中Sender可以通过.net的机制来捕获,而EventArgs和MouseEventArgs 该如何使用呢?或者说如何给它赋值?暂时没有办法,还请高人指点。
   其实这个问题可以通过匿名委托来解决。
 
2、使用匿名委托给一些EventHandler/MouseEventHandler的方法传参数
关键代码如下:

  1. public void setSeatButtonMove_EventHandler(CSeatButton seatBtn, Object parentForm)
  2. {
  3. ///* 常规事件加载方式 */
  4. //seatBtn.button1.Click -= new EventHandler(seatButtonClick_Handler);
  5. //seatBtn.button1.MouseUp -= new MouseEventHandler(seatButtonUp_Handler);
  6. //seatBtn.button1.Click += new EventHandler(seatButtonClick_Handler);
  7. //seatBtn.button1.MouseUp += new MouseEventHandler(seatButtonUp_Handler);
  8. /* 匿名事件加载方式 */
  9. seatBtn.button1.Click -= delegate(Object o, EventArgs e) { seatButtonClick_Handler(seatBtn.button1, parentForm); };
  10. seatBtn.button1.MouseUp -= delegate(Object o, MouseEventArgs e) { seatButtonUp_Handler(seatBtn.button1, parentForm); };
  11. seatBtn.button1.Click += delegate(Object o, EventArgs e) { seatButtonClick_Handler(seatBtn.button1, parentForm); };
  12. seatBtn.button1.MouseUp += delegate(Object o, MouseEventArgs e) { seatButtonUp_Handler(seatBtn.button1, parentForm); };
  13. }
  14. public void seatButtonClick_Handler(object sender,object formOfSender)
  15. {
  16. string formName = ((Form)formOfSender).Name.Trim();
  17. if (formName.Equals("Form1"))
  18. {
  19. MessageBox.Show("In Form1,click a button!");
  20. }
  21. if (formName.Equals("Form2"))
  22. {
  23. MessageBox.Show("In Form2,click a button!");
  24. }
  25. }

使用EventHandler传递参数的更多相关文章

  1. Silverlight子窗口(ChildWindow)传递参数到父窗口演示

    在企业级项目中,子窗口(ChildWindow)是一个常用控件,其展示方式是以弹出窗口来显示信息. 这里我将演示,子窗口传递参数到父窗口的方法.由于我的开发环境都是英文环境,所以部分中文可能显示不正常 ...

  2. Vue 给子组件传递参数

    Vue 给子组件传递参数 首先看个例子吧 原文 html <div class="container" id="app"> <div clas ...

  3. [转] C++的引用传递、指针传递参数在java中的相应处理方法

    原文出处:[http://blog.csdn.net/conowen/article/details/7420533] 首先要明白一点,java是没有指针这个概念的. 但是要实现C++的引用传递.指针 ...

  4. 记一次WinForm程序中主进程打开子进程并传递参数的操作过程(进程间传递参数)

    目标:想在WinForm程序之间传递参数.以便子进程作出相应的处理. 一种错误的方法 父进程的主程序: ProcessStartInfo psi = new ProcessStartInfo(); p ...

  5. 在 Angularjs 中 ui-sref 和 $state.go 如何传递参数

    1 ui-sref.$state.go 的区别 ui-sref 一般使用在 <a>...</a>: <a ui-sref="message-list" ...

  6. Linux线程体传递参数的方法详解

    传递参数的两种方法 线程函数只有一个参数的情况:直接定义一个变量通过应用传给线程函数. 例子 #include #include using namespace std; pthread_t thre ...

  7. 【hadoop】如何向map和reduce脚本传递参数,加载文件和目录

    本文主要讲解三个问题:       1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数.       2 使用Streaming编写MapReduce程序(C/C++ ...

  8. python 函数传递参数的多种方法

    python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...

  9. Apache AB 如何传递参数

    AB使用时,网上通篇一律,在进行示例时使用的连接一般都是http://*.com,这种写法是没有带参数,如果你想测试一个写入的Case,那需要传递参数给后台,如何传递参数呢? 这里有一个登录的请求,需 ...

随机推荐

  1. Android 如何在xmL 里面动态设置padding

    如题,Android 如何在xmL 里面动态设置padding 有时候,你的布局加载完成之后,你findViewByid 找到控件,设置padding 会导致白条,布局闪动,那怎么办呢? 你是不是就想 ...

  2. 分别用反射、编程接口的方式创建DataFrame

    1.通过反射的方式 使用反射来推断包含特定数据类型的RDD,这种方式代码比较少,简洁,只要你会知道元数据信息时什么样,就可以使用了 代码如下: import org.apache.spark.sql. ...

  3. (1)strchr

    const char * strchr ( const char * str, int character ); char * strchr ( char * str, int character ) ...

  4. laravel5.5开发composer扩展包

    目录 1. 下载laravel框架,并命名(framework) 2. 创建相关目录 3. 项目根目录下的composer.json文件中声明命名空间 4. 在包的根目录(packages/arche ...

  5. 路由vue-router进阶

    目录 1. 导航守卫 1.1. 全局守卫 1.2. 全局解析守卫 1.3. 全局后置钩子 1.4. 路由独享的守卫 1.5. 组件内的守卫 1.6. 完整的导航解析流程 2. 路由元信息 3. 获取数 ...

  6. Pascal小游戏 文件的产生

    一个整人的Pascal小程序 运行之后硬盘里面会有一大堆垃圾,当然更好的方法当然不是这样做! var a,b,c,d:char;beginfor a:='0' to '9' dofor b:='0' ...

  7. 《算法》C++代码 前言

    现在大二正在上<数据结构>课,课内的书上代码实现很喜欢无脑用类.变量名字很长,而且常常实现太繁琐,并且代码有些无法运行,这些对于老手无所谓,但初学者看起来却会很不舒服.因此写点自己的代码, ...

  8. python之上下文管理、redis的发布订阅、rabbitmq

    使用with打开文件的方式,是调用了上下文管理的功能 #打开文件的两种方法: f = open('a.txt','r') with open('a.txt','r') as f 实现使用with关闭s ...

  9. 2 28TOP100

    import json import requests from requests.exceptions import RequestException import re import time d ...

  10. Nginx和Squid配合搭建的Web服务器前端系统

    这个架构是目前我个人觉得比较稳妥并且最方便的架构,易于多数人接受: 前端的lvs和squid,按照安装方法,把epoll打开,配置文件照搬,基本上问题不多. 这个架构和app_squid架构的区别,也 ...