如何重写BindingNavigator删除/添加按钮Click事件?移除默认事件求助
首先,你不需要纠结于“默认事件的名称”——因为设计器生成的BindingNavigator按钮,其默认行为并不是通过一个你能直接引用的命名事件处理程序绑定的,而是通过BindingNavigator自身的属性关联到BindingSource的操作。下面给你两种靠谱的解决方案:
方法一:解除导航器与按钮的关联(推荐)
这是最规范的做法,因为BindingNavigator是通过DeleteItem和AddNewItem属性来识别哪个按钮负责删除/添加操作的。你只需要先把这些属性置空,再给按钮绑定自己的事件:
针对删除按钮:
// 先让BindingNavigator不再处理这个删除按钮的默认行为 this.bindingNavigator1.DeleteItem = null; // 绑定你的自定义删除事件 this.bindingNavigatorDeleteItem.Click += myDeleteClickEventHandler;
针对添加按钮:
如果之后你也想替换添加按钮的行为,同理:
this.bindingNavigator1.AddNewItem = null; this.bindingNavigatorAddNewItem.Click += myAddClickEventHandler;
这种方法的好处是完全切断了默认逻辑,不会有冲突,而且符合WinForms的设计规范。
方法二:移除所有现有Click事件处理程序(不推荐但可行)
如果你非要直接移除默认的事件绑定,可以通过反射来清除按钮的所有Click事件处理程序(因为默认的是内部匿名方法,你无法直接引用)。代码示例:
// 反射获取按钮的Click事件的事件处理列表 var clickEvent = typeof(Control).GetEvent("Click"); var eventHandlerListProperty = typeof(Control).GetProperty("Events", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); var eventHandlerList = (EventHandlerList)eventHandlerListProperty.GetValue(this.bindingNavigatorDeleteItem); var clickEventKey = typeof(Control).GetField("EventClick", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).GetValue(null); // 移除所有Click事件处理程序 eventHandlerList.RemoveHandler(clickEventKey, eventHandlerList[clickEventKey]); // 再绑定你的自定义事件 this.bindingNavigatorDeleteItem.Click += myDeleteClickEventHandler;
不过这种方法依赖于WinForms的内部实现,可能在不同.NET版本中出现兼容性问题,所以优先推荐方法一。
补充说明
默认情况下,删除按钮的行为是调用绑定的BindingSource.RemoveCurrent()方法,添加按钮则是调用BindingSource.AddNew()方法——这就是它们的默认逻辑核心,你在自定义事件处理程序里可以根据需要复用或修改这些逻辑。
内容的提问来源于stack exchange,提问作者JimOfTheNorth




