要在控件上创建新的事件处理程序,您可以执行此操作
c.Click += new EventHandler(mainFormButton_Click);
Run Code Online (Sandbox Code Playgroud)
或这个
c.Click += mainFormButton_Click;
Run Code Online (Sandbox Code Playgroud)
并删除事件处理程序,您可以执行此操作
c.Click -= mainFormButton_Click;
Run Code Online (Sandbox Code Playgroud)
但是如何从事件中删除所有事件处理程序?
我想从按钮中删除所有单击事件处理程序.我在Stack Overflow问题中找到了这个方法如何从控件中删除所有事件处理程序.
private void RemoveClickEvent(Button b)
{
FieldInfo f1 = typeof(Control).GetField("EventClick",
BindingFlags.Static |
BindingFlags.NonPublic);
object obj = f1.GetValue(b);
PropertyInfo pi = b.GetType().GetProperty("Events",
BindingFlags.NonPublic |
BindingFlags.Instance);
EventHandlerList list = (EventHandlerList)pi.GetValue(b, null);
list.RemoveHandler(obj, list[obj]);
}
Run Code Online (Sandbox Code Playgroud)
但是这一行总是返回null:
typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
Run Code Online (Sandbox Code Playgroud)
这种方法写于2006年.
这个方法有最新版本吗?
我需要从从我没有代码的 dll 加载的控件中删除事件处理程序。由于似乎没有“官方”(即受 .NET Framework 的公共方法支持),因此我能够创建几个扩展方法,这些方法正是使用反射来完成此操作。
有关所有详细信息,请参阅此博客文章:使用反射从 WinForm ListView 控件中删除事件
以下是如何删除 SelectedIndexChanged 事件的代码示例(动态且无需访问原始处理程序)
//for a UserControl (in fact any control that implements System.ComponentModel.Component)
var userControl = new UserControl();
//we can get the current mapped event handlers
userControl.eventHandlers();
//its signature
userControl.eventHandlers_MethodSignatures();
//remove one by using the static field name
userControl.remove_EventHandler("EVENT_SELECTEDINDEXCHANGED");
//or use this one specifically mapped to the SelectedIndexChanged event
userControl.remove_Event_SelectedIndexChanged
Run Code Online (Sandbox Code Playgroud)
我的问题是:“还有其他方法吗?”
虽然我的解决方案有效并且看起来稳定,但我正在进行内部 .NET 对象操作,所以也许有更好的解决方案(在 4.0 或 4.5 中)?
相关文章: