You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Forms中如何判断异常是否由ToolStripButton点击触发?

解决BindingNavigator导航按钮异常的判断方案

你之前用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();
    }
}

方法二:给导航按钮添加状态标记(更可靠)

给每个导航按钮绑定点击事件,设置临时标记,在异常处理时检查该标记:

  1. 先定义一个私有变量:
private bool _isNavigating = false;
  1. 为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;
    }
}
  1. 修改异常处理方法:
private void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
    if (_isNavigating)
    {
        MessageBox.Show(e.Exception.Message);
        bsRestrictions.CancelEdit();
        // 重置标记,避免后续误判
        _isNavigating = false;
    }
}

注意:如果BindingNavigator的按钮是自动生成的,需要确保在设计器中为这些按钮绑定上述点击事件,或者在用户控件的构造函数中手动绑定。

内容的提问来源于stack exchange,提问作者DotNet Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:11:03