使用EventHandler传递参数

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. }
posted @   沙耶  阅读(14879)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示