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

时间:2010-05-28 02:05:32

标签: c# winforms .net-3.5

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

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

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

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

3 个答案:

答案 0 :(得分:39)

当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;
}

答案 1 :(得分:7)

TabControl有一个TabPages的集合,您可以在其中强制执行验证,例如:

public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();

        foreach (var page in _tabControl.TabPages.Cast<TabPage>())
        {
            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;
    }
}

答案 2 :(得分:6)

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

甚至标签页验证事件在进入标签时都会触发而不是离开它 - 无论是那个还是那个我的机器或.NET 4上发生的特殊情况。另一方面,在.NET 4中有取消选举事件,在适当的时间为我的目的而开火。

    private void tab_Deselecting(object sender, TabControlCancelEventArgs e)
    {

    }