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

Posted

技术标签:

【中文标题】如何在 SelectedIndexChanged 事件之前检测 TabControl 中标签页的更改?【英文标题】:How do I detect a change of tab page in TabControl prior to SelectedIndexChanged event? 【发布时间】:2011-02-24 22:57:32 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

即使是标签页验证事件在进入标签页而不是离开它时也会触发 - 要么就是我的机器或 .NET 4 发生了一些特殊情况。另一方面,在 .NET 4 中存在 Deselecting 事件为我的目的在正确的时间触发。

    private void tab_Deselecting(object sender, TabControlCancelEventArgs e)
    

    

【讨论】:

【参考方案2】:

在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;

【讨论】:

正是我正在寻找的事件(显然没有看到)。谢谢。 您在此处拥有的“当前”标签页不是您要验证的标签页(它是新标签页)。必须管理上一个 TabPage,例如在 Selected 事件中。 我实际上不得不自己执行此操作,并且还发现您需要按照 Chris Schmich 的回答使用选项卡验证。 Selected、Selecting(TabIndexChanged 或 SelectedIndexChanged)事件均未引用当前选项卡。【参考方案3】:

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;
    

【讨论】:

我之前使用过验证事件并再次考虑过它,但对于这个应用程序来说,它已经超出了我的需要。不过谢谢。

以上是关于如何在 SelectedIndexChanged 事件之前检测 TabControl 中标签页的更改?的主要内容,如果未能解决你的问题,请参考以下文章

仅在单击指定按钮时如何启动 DropDownList SelectedIndexChanged 事件?

Binding SelectedIndexChanged

c#中,如何对COMBOBOX的SelectedIndexChanged事件分别执行程序?

无法在组合框c#(和xaml)中执行selectedIndexChanged

DropDownList 控件不能触发SelectedIndexChanged 事件

SelectedIndexChanged 触发重新计算工作表