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賦值。
這兩個委托的定義如下:
EventHandler:
.NET Framework 中的事件模型基於具有事件委托,該委托將事件與事件處理程序連接。引發事件需要兩個元素:
標識對事件提供響應的方法的委托。
保存事件數據的類。
- public delegate void EventHandler(Object sender, EventArgs e);
- public event EventHandler NoDataEventHandler;
-
MouseEventHandler:
表示將處理窗體、控件或其他組件的 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!");
- }
- }