2009-09-22 48 views
0

这是一个C#,Winform问题。一旦从TabControl的SelectedIndexChanged事件抛出异常,就无法以编程方式更改标签页

我有一个TabControl控件,并使用两个导航按钮在我的标签页之间切换。我使用TabControl.SelectedIndex = i来更改按钮'click事件中的显示标签页。每次显示特定的标签页时,都会调用其中一个函数来准备一些后台工作。对函数的调用被放到TabControl.SelectedIndexChanged事件中。

我遇到了一个问题。如果从TabControl.SelectedIndexChanged事件(从该事件中调用的几个函数之一)引发异常,我不再可以使用编程方式在标签页之间切换。一旦抛出一个异常,导航按钮不能改变TabControl的显示标签。更具体地说,TabControl的SelectedIndex仍然可以更改,标签页UI仍会更改,但标签页内容与抛出异常的页面保持不变。

之前有人遇到过这个问题吗?任何解决方案非常感谢。

回答

2

作为一般规则,应捕获并处理WinForms事件处理程序中的异常。如果允许异常进入WinForms代码,奇怪的行为 - 就像你正在经历的那样 - 是常见的结果。

使用Reflector查看System.Windows.Forms.TabControl,其WndProc()方法调用WmSelChange(),它调用您的事件处理函数。当事件处理程序发生异常时,该异常会将堆栈过滤到WndProc。 WndProc中不处理例外,所以这一点,如果/然后在WndProc中的最后声明不会被调用:

if (m.Msg == this.tabBaseReLayoutMessage) 
{ 
    this.WmTabBaseReLayout(ref m); 
} 
else 
{ 
    base.WndProc(ref m); 
} 

因此标签控件的内部状态被破坏,导致古怪的行为。

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

+0

非常感谢解决方案。这很有帮助。 – Steve 2009-09-23 03:53:25

相关问题