C#解决EventHandler参数无法传递问题

简介: 1、MouseEventHandler和EventHandler传递参数的局限性分析     开发过程中,特别是使用自定义控件时,常常需要对一个控件的click,mouseDown,mouseUp等事件的处理进行重新定义,以满足实际工程应用和要求。

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赋值。

    CSDN上对这两个委托的定义如下:

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. }

 

image图1

 

image 图2

 

    通过类似下面的语句:


  1. delegate(Object o, EventArgs e) { seatButtonClick_Handler(seatBtn.button1, parentForm); };

    我们可能delegate后面接一个函数或者一些参数语句来实现对对自定义事件处理函数的参数传递。

3、测试工程案例代码

 img_e25d4fb2f8de1caf41a735ec53088516.pngAnonymousDelegate.zip

参考博客:

http://www.jb51.net/article/18150.htm

相关文章
|
存储 编解码 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
177 0
|
9月前
|
JSON C# 数据格式
【Azure Function】C#独立工作模式下参数类型 ServiceBusReceivedMessage 无法正常工作
Cannot convert input parameter 'message' to type 'Azure.Messaging.ServiceBus.ServiceBusReceivedMessage' from type 'System.String'.
180 73
|
存储 Java 编译器
C# 变量与参数详解
C# 变量与参数详解
131 0
|
开发框架 小程序 .NET
C#动态生成带参数的小程序二维码
C#动态生成带参数的小程序二维码
|
存储 C#
C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析
方法是一段代码,只有在调用时才会运行。 您可以将数据(称为参数)传递给方法。 方法用于执行某些操作,也被称为函数。 为什么使用方法?为了重用代码:定义一次代码,然后多次使用。
293 0
|
C# 数据安全/隐私保护
C# 窗体之间参数互相传递的两种方法与使用
C# 窗体之间参数互相传递的两种方法与使用
|
存储 API C#
Baumer工业相机堡盟工业相机如何通过文件保存和导入的方式保存和载入相机的各类参数(C#)
Baumer工业相机堡盟工业相机如何通过文件保存和导入的方式保存和载入相机的各类参数(C#)
194 0
|
存储 编解码 开发工具
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
91 0
|
数据挖掘 编译器 C#
【C#本质论 五】方法和参数
【C#本质论 五】方法和参数
101 0

热门文章

最新文章