代码之家  ›  专栏  ›  技术社区  ›  JYelton Melchior Blausand

在SelectedIndexChanged事件之前,如何检测TabControl中选项卡页的更改?

  •  27
  • JYelton Melchior Blausand  · 技术社区  · 14 年前

    我目前确定通过 SelectedIndexChanged 事件。

    我想检测一下 之前 出于验证目的,所选索引实际更改。例如,用户单击的选项卡页面不是他们正在查看的页面。如果表单数据未保存,将显示一个对话框,询问是否可以继续。如果用户单击“否”,则用户应保留在当前选项卡上。

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

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

    3 回复  |  直到 8 年前
        1
  •  37
  •   Peter Mortensen John Conde    8 年前

    当窗体加载时向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;
    }
    
        2
  •  7
  •   Chris Schmich    14 年前

    这个 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;
        }
    }
    
        3
  •  6
  •   Peter Mortensen John Conde    8 年前

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

    即使是选项卡页验证事件,也会在进入选项卡而不是离开选项卡时触发——或者是在我的计算机或.NET 4上发生了一些异常情况。另一方面,在.NET 4中有一个取消选择事件,它在正确的时间为我的目的而触发。

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