Как обнаружить изменение вкладки в TabControl до события SelectedIndexChanged? - PullRequest
29 голосов
/ 28 мая 2010

В настоящее время я определяю, на какой странице TabControl щелкали с помощью события SelectedIndexChanged.

Я хотел бы обнаружить до того, как выбранный индекс действительно изменится, в целях проверки. Например, пользователь нажимает на вкладку, отличную от той, которую он просматривает. Диалог отображается, если данные формы не сохранены, и спрашивает, можно ли продолжить. Если пользователь нажимает нет, он должен оставаться на текущей вкладке.

В настоящее время я должен запомнить предыдущую вкладку и вернуться к ней после ответа «нет».

Я рассмотрел MouseDown (и различную логику вычислений), но сомневаюсь, что это лучший способ.

Ответы [ 3 ]

39 голосов
/ 28 мая 2010

Добавить такое событие в tabControl, когда form_load:

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;
}
7 голосов
/ 28 мая 2010

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;
    }
}
6 голосов
/ 19 ноября 2014

Я на самом деле перепробовал все события, включая приведенные здесь предложения, и ни одно из упомянутых событий не произошло в нужное время, чтобы фактически перехватить перемещение с вкладки.

Даже событие проверки страницы вкладки срабатывает при входе на вкладку, а не при ее выходе - либо это, либо происходит что-то своеобразное с моей машиной или .NET 4. С другой стороны, в .NET 4 есть событие Отмена выбора, которое стреляет в нужное время для моих целей.

    private void tab_Deselecting(object sender, TabControlCancelEventArgs e)
    {

    }
...