如何在SelectedIndexChanged事件之前检测TabControl中标签页的更改?

我目前通过SelectedIndexChanged事件确定单击了tabcontrol的哪个页面。

我想在选定的索引实际更改之前检测,以进行validation。 例如,用户单击他们正在查看的标签页以外的标签页。 如果表单数据未保存,则会显示一个对话框,询问是否可以继续。 如果用户单击否,则用户应保留在当前选项卡上。

目前我必须记住上一个标签页,并在回答“否”后切换回它。

我考虑过MouseDown(和各种计算逻辑),但我怀疑这是最好的方法。

在form_load时将这样的事件添加到tabControl:

 tabControl1.Selecting += new TabControlCancelEventHandler(tabControl1_Selecting); void tabControl1_Selecting(object sender, TabControlCancelEventArgs e) { TabPage current = (sender as TabControl).SelectedTab; // Validate the current page. To cancel the select, use: e.Cancel = true; } 

TabControl有一个TabPages集合,每个TabPages都可以强制执行validation,例如:

 public partial class MyForm : Form { public MyForm() { InitializeComponent(); foreach (var page in _tabControl.TabPages.Cast()) { page.CausesValidation = true; page.Validating += new CancelEventHandler(OnTabPageValidating); } } void OnTabPageValidating(object sender, CancelEventArgs e) { TabPage page = sender as TabPage; if (page == null) return; if (/* some validation fails */) e.Cancel = true; } } 

我实际上已经尝试了所有的事件,包括这里的建议,并且在正确的时间没有提到任何事件来实际陷阱从标签移动。

甚至标签页validation事件在进入选项卡时都会触发而不是离开它 – 无论是那个还是我的机器或.NET 4上发生了什么奇怪的事情。另一方面,在.NET 4中有一个取消选择事件,它会触发适合我的目的。

  private void tab_Deselecting(object sender, TabControlCancelEventArgs e) { }