Windows Forms中如何判断异常是否由ToolStripButton点击触发?
你之前用Pressed属性判断无效,是因为按钮的Pressed状态仅在鼠标按压期间有效,异常抛出时导航逻辑已经执行,按钮已弹起,所以该属性返回false。以下两种方法可以准确判断异常是否来自ToolStripButton的导航点击:
方法一:通过调用栈追踪异常来源
在Application_ThreadException事件中,遍历异常的调用栈帧,查找是否包含BindingNavigator导航按钮的相关执行方法:
private void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { var stackTrace = new StackTrace(e.Exception, true); // 检查调用栈中是否包含BindingNavigator导航按钮的点击或导航方法 var isNavButtonTriggered = stackTrace.GetFrames() .Any(frame => { var method = frame.GetMethod(); // 匹配导航按钮点击相关方法,比如MovePrevious、MoveNext等 return method.Name.StartsWith("Move") && method.DeclaringType == typeof(BindingNavigator) || method.DeclaringType == typeof(ToolStripButton) && method.Name == "OnClick"; }); if (isNavButtonTriggered) { MessageBox.Show(e.Exception.Message); bsRestrictions.CancelEdit(); } }
方法二:给导航按钮添加状态标记(更可靠)
给每个导航按钮绑定点击事件,设置临时标记,在异常处理时检查该标记:
- 先定义一个私有变量:
private bool _isNavigating = false;
- 为BindingNavigator的四个导航按钮添加点击事件处理:
private void bindingNavigatorMoveFirstItem_Click(object sender, EventArgs e) { _isNavigating = true; try { bsRestrictions.MoveFirst(); } finally { _isNavigating = false; } } private void bindingNavigatorMovePreviousItem_Click(object sender, EventArgs e) { _isNavigating = true; try { bsRestrictions.MovePrevious(); } finally { _isNavigating = false; } } // 同理实现MoveNext和MoveLast的点击事件 private void bindingNavigatorMoveNextItem_Click(object sender, EventArgs e) { _isNavigating = true; try { bsRestrictions.MoveNext(); } finally { _isNavigating = false; } } private void bindingNavigatorMoveLastItem_Click(object sender, EventArgs e) { _isNavigating = true; try { bsRestrictions.MoveLast(); } finally { _isNavigating = false; } }
- 修改异常处理方法:
private void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { if (_isNavigating) { MessageBox.Show(e.Exception.Message); bsRestrictions.CancelEdit(); // 重置标记,避免后续误判 _isNavigating = false; } }
注意:如果BindingNavigator的按钮是自动生成的,需要确保在设计器中为这些按钮绑定上述点击事件,或者在用户控件的构造函数中手动绑定。
内容的提问来源于stack exchange,提问作者DotNet Developer
相关产品推荐
相关产品推荐

