Winforms 一旦从TabControl上的SelectedIndexChanged事件引发异常,则无法以编程方式更改选项卡页

Winforms 一旦从TabControl上的SelectedIndexChanged事件引发异常,则无法以编程方式更改选项卡页,winforms,c#-3.0,tabcontrol,Winforms,C# 3.0,Tabcontrol,这是一个C#,Winform问题 我有一个TabControl控件,我使用两个导航按钮在选项卡页面之间切换。我使用TabControl.SelectedIndex=I更改按钮单击事件中显示的选项卡页面。每次显示特定的选项卡页面时,都会调用几个函数中的一个来准备一些背景工作。对函数的调用被放入TabControl.SelectedIndexChanged事件 我遇到了一个问题。如果从TabControl.SelectedIndexChanged事件(从该事件中调用的几个函数之一)引发异常,我将无法

这是一个C#,Winform问题

我有一个TabControl控件,我使用两个导航按钮在选项卡页面之间切换。我使用TabControl.SelectedIndex=I更改按钮单击事件中显示的选项卡页面。每次显示特定的选项卡页面时,都会调用几个函数中的一个来准备一些背景工作。对函数的调用被放入TabControl.SelectedIndexChanged事件

我遇到了一个问题。如果从TabControl.SelectedIndexChanged事件(从该事件中调用的几个函数之一)引发异常,我将无法再使用编程方式在选项卡页面之间切换。一旦抛出一个异常,导航按钮将无法更改TabControl的显示选项卡。更具体地说,TabControl的SelectedIndex仍然可以更改,tabs UI仍然可以更改,但tab页面内容仍然与抛出异常的页面相同


以前有人遇到过这个问题吗?有解决办法吗?非常感谢。

一般来说,WinForms事件处理程序中的异常应该被捕获并处理。如果允许异常进入WinForms代码的堆栈,那么奇怪的行为——比如您正在经历的行为——是常见的结果

使用查看System.Windows.Forms.TabControl,其WndProc()方法调用WmSelChange(),该方法调用事件处理程序。当事件处理程序中发生异常时,异常会向上渗透到堆栈WndProc。WndProc不处理异常,因此WndProc末尾的if/then语句永远不会被调用:

if (m.Msg == this.tabBaseReLayoutMessage)
{
    this.WmTabBaseReLayout(ref m);
}
else
{
    base.WndProc(ref m);
}
因此,选项卡控件的内部状态已损坏,导致异常行为

为了干净地处理选项卡更改期间可能发生的异常,我建议使用Selecting事件来执行后台工作(此事件在SelectedIndexChanged事件之前触发)。使用try/catch语句,并在catch子句中将TabControlCancelEventArgs.Cancel设置为true以取消选项卡更改