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

JYe*_*ton 32 c# .net-3.5 winforms

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

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

目前我必须记住上一个标签页并在回答"否"后切换回它.

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

Che*_*hen 43

在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;
}
Run Code Online (Sandbox Code Playgroud)

  • 您在这里的"当前"标签页不是您要验证的标签页(它是新标签页).必须例如在Selected事件中管理先前的TabPage. (4认同)

Chr*_*ich 7

TabControl有一个TabPages集合,每个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我之前使用过 Validation 事件并再次考虑过它,但就本应用程序而言,它超出了我的需要。不过谢谢。 (2认同)

mat*_*tpm 6

我实际上已经尝试了所有的事件,包括这里的建议,并且没有一个提到的事件在恰当的时间发生,实际上陷阱从标签移动.

甚至标签页验证事件在进入选项卡时都会触发而不是离开它 - 无论是那个还是我的机器或.NET 4都有一些特殊的东西.另一方面,在.NET 4中有一个取消选择事件,它会触发适合我的目的.

    private void tab_Deselecting(object sender, TabControlCancelEventArgs e)
    {

    }
Run Code Online (Sandbox Code Playgroud)