假设我有两个用户控件,我想从一个控件实例中删除一个事件处理程序。
为了说明我刚刚将其设为按钮作为用户控件:
public partial class SuperButton : UserControl
{
public SuperButton()
{
InitializeComponent();
}
private void button1_MouseEnter(object sender, EventArgs e)
{
button1.BackColor = Color.CadetBlue;
}
private void button1_MouseLeave(object sender, EventArgs e)
{
button1.BackColor = Color.Gainsboro;
}
}
我在表单中添加了两个超级按钮,我想禁用SuperButton2的MouseEnter事件触发。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
superButton2.RemoveEvents<SuperButton>("EventMouseEnter");
}
}
public static class EventExtension
{
public static void RemoveEvents<T>(this Control target, string Event)
{
FieldInfo f1 = typeof(Control).GetField(Event, BindingFlags.Static | BindingFlags.NonPublic);
object obj = f1.GetValue(target.CastTo<T>());
PropertyInfo pi = target.CastTo<T>().GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
EventHandlerList list = (EventHandlerList)pi.GetValue(target.CastTo<T>(), null);
list.RemoveHandler(obj, list[obj]);
}
public static T CastTo<T>(this object objectToCast)
{
return (T)objectToCast;
}
}
代码运行但不起作用 - MouseEnter和Leave事件仍然会触发。我想做这样的事情:
superButton2.MouseEnter - = xyz.MouseEnter;
更新:阅读此评论问题...
答案 0 :(得分:2)
在您的情况下,您不需要一次删除所有事件处理程序,只需要删除您感兴趣的特定事件处理程序。使用-=
删除同一个处理程序使用+=
添加一个的方式:
button1.MouseEnter -= button1_MouseEnter;
答案 1 :(得分:1)
为什么不设置superButton2.MouseEnter = null;
?这应该是技巧,直到MouseEnter
被赋予一个值。
只是为了更新,另一种处理它的方式,并且完全合法:)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace TestControls
{
class SimpleButton:Button
{
public bool IgnoreMouseEnter { get; set; }
public SimpleButton()
{
this.IgnoreMouseEnter = false;
}
protected override void OnMouseEnter(EventArgs e)
{
Debug.Print("this.IgnoreMouseEnter = {0}", this.IgnoreMouseEnter);
if (this.IgnoreMouseEnter == false)
{
base.OnMouseEnter(e);
}
}
}
}