1、MouseEventHandler和EventHandler传递参数的局限性分析
开发过程中,特别是使用自定义控件时,常常需要对一个控件的click,mouseDown,mouseUp等事件的处理进行重新定义,以满足实际工程应用和要求。常用的方法如下:
-
button1.Click -= new EventHandler(ButtonClick_Handler);
-
button1.MouseUp -= new MouseEventHandler(ButtonUp_Handler);
-
button1.Click += new EventHandler(ButtonClick_Handler);
- MouseUp += new MouseEventHandler(ButtonUp_Handler);
可以看到,这里是通过EventHandler和MouseEventHandler这两个委托来能click和mouseup赋值。
CSDN上对这两个委托的定义如下:
EventHandler:
.NET Framework 中的事件模型基于具有事件委托,该委托将事件与事件处理程序连接。引发事件需要两个元素:
标识对事件提供响应的方法的委托。
保存事件数据的类。
-
public delegate void EventHandler(Object sender, EventArgs e);
-
public event EventHandler NoDataEventHandler;
-
表示将处理窗体、控件或其他组件的 MouseDown、MouseUp 或 MouseMove 事件的方法。
委托的原型:
-
public delegate void MouseEventHandler(
-
Object sender,
-
MouseEventArgs e
- )
这两个委托都有两个参数,其中Sender可以通过.net的机制来捕获,而EventArgs和MouseEventArgs 该如何使用呢?或者说如何给它赋值?暂时没有办法,还请高人指点。
其实这个问题可以通过匿名委托来解决。
2、使用匿名委托给一些EventHandler/MouseEventHandler的方法传参数
关键代码如下:
-
public void setSeatButtonMove_EventHandler(CSeatButton seatBtn, Object parentForm)
-
{
-
///* 常规事件加载方式 */
-
//seatBtn.button1.Click -= new EventHandler(seatButtonClick_Handler);
-
//seatBtn.button1.MouseUp -= new MouseEventHandler(seatButtonUp_Handler);
-
//seatBtn.button1.Click += new EventHandler(seatButtonClick_Handler);
-
//seatBtn.button1.MouseUp += new MouseEventHandler(seatButtonUp_Handler);
-
/* 匿名事件加载方式 */
-
seatBtn.button1.Click -= delegate(Object o, EventArgs e) { seatButtonClick_Handler(seatBtn.button1, parentForm); };
-
seatBtn.button1.MouseUp -= delegate(Object o, MouseEventArgs e) { seatButtonUp_Handler(seatBtn.button1, parentForm); };
-
seatBtn.button1.Click += delegate(Object o, EventArgs e) { seatButtonClick_Handler(seatBtn.button1, parentForm); };
-
seatBtn.button1.MouseUp += delegate(Object o, MouseEventArgs e) { seatButtonUp_Handler(seatBtn.button1, parentForm); };
-
}
-
-
public void seatButtonClick_Handler(object sender,object formOfSender)
-
{
-
string formName = ((Form)formOfSender).Name.Trim();
-
if (formName.Equals("Form1"))
-
{
-
MessageBox.Show("In Form1,click a button!");
-
}
-
if (formName.Equals("Form2"))
-
{
-
MessageBox.Show("In Form2,click a button!");
-
}
- }
通过类似下面的语句:
- delegate(Object o, EventArgs e) { seatButtonClick_Handler(seatBtn.button1, parentForm); };
我们可能delegate后面接一个函数或者一些参数语句来实现对对自定义事件处理函数的参数传递。
3、测试工程案例代码
参考博客: