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

本文探讨了在C#中使用EventHandler和MouseEventHandler时遇到的参数传递限制,并介绍了一种利用匿名委托解决这一问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


button1.Click-=newEventHandler(ButtonClick_Handler);


button1.MouseUp-=newMouseEventHandler(ButtonUp_Handler);


button1.Click+=newEventHandler(ButtonClick_Handler);


MouseUp+=newMouseEventHandler(ButtonUp_Handler);
    
可以看到,这里是通过EventHandler和MouseEventHandler这两个委托来能click和mouseup赋值。
优快云上对这两个委托的定义如下:EventHandler:
.NET Framework 中的事件模型基于具有事件委托,该委托将事件与事件处理程序连接。引发事件需要两个元素:
标识对事件提供响应的方法的委托。
保存事件数据的类。

publicdelegatevoidEventHandler(Objectsender,EventArgse);


publiceventEventHandlerNoDataEventHandler;



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



publicdelegatevoidMouseEventHandler(


    Objectsender,


    MouseEventArgse


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



publicvoidsetSeatButtonMove_EventHandler(CSeatButton seatBtn,ObjectparentForm)


{


    ///* 常规事件加载方式 */


    //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(Objecto,EventArgse){seatButtonClick_Handler(seatBtn.button1,parentForm);};


    seatBtn.button1.MouseUp-=delegate(Objecto,MouseEventArgse){seatButtonUp_Handler(seatBtn.button1,parentForm);};


    seatBtn.button1.Click+=delegate(Objecto,EventArgse){seatButtonClick_Handler(seatBtn.button1,parentForm);};


    seatBtn.button1.MouseUp+=delegate(Objecto,MouseEventArgse){seatButtonUp_Handler(seatBtn.button1,parentForm);};


}




publicvoidseatButtonClick_Handler(objectsender,objectformOfSender)


{


    stringformName=((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(Objecto,EventArgse){seatButtonClick_Handler(seatBtn.button1,parentForm);};
    我们可能delegate后面接一个函数或者一些参数语句来实现对对自定义事件处理函数的参数传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值