Подтвердить что ты не робот

Как определить изменение закладки в TabControl до события SelectedIndexChanged?

В настоящее время я определяю, на какую страницу элемента управления tabcontrol было нажато событие SelectedIndexChanged.

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

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

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

4b9b3361

Ответ 1

Добавьте такое событие в 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;
}

Ответ 2

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

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

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

    private void tab_Deselecting(object sender, TabControlCancelEventArgs e)
    {

    }