Как узнать, с какой вкладки вы переходите с / на вкладку WinForms? - PullRequest
7 голосов
/ 24 августа 2009

Мне нужно определить, с какой вкладки пользователь заходит и собирается, когда они переключают вкладки, и, возможно, отменяет переключение. Я попытался отменить выбор, отменить выбор, выбор, выбранные события, и все они показывают, что e.TabPageIndex совпадает с sender.SelectedIndex.

Есть ли событие или свойство, которое я могу использовать, чтобы определить обе стороны этого, или мне нужно взломать что-то вместе с кэшированием его из одного события и использовать это значение в новом событии.

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

Я пробовал и в C #, и в VB, с одинаковыми результатами (не удивительно).

Спасибо.

Ответы [ 8 ]

8 голосов
/ 24 августа 2009

Не похоже, что какой-либо один аргумент события будет содержать детали как предыдущей, так и текущей вкладок, поэтому вам нужно обработать пару событий, чтобы отслеживать.

Как минимум, вам нужно использовать событие Deselected, чтобы сохранить ссылку на ранее выбранную вкладку. Вы всегда можете запросить TabControl для его текущей вкладки. Чтобы растянуть немного дальше, вы также можете обработать событие Selected для отслеживания текущей вкладки.

Option Strict On
Option Explicit On

Public Class Form1

    Private PreviousTab As TabPage
    Private CurrentTab As TabPage

    Private Sub TabControl1_Deselected(ByVal sender As Object, ByVal e As System.Windows.Forms.TabControlEventArgs) Handles TabControl1.Deselected
        PreviousTab = e.TabPage
        Debug.WriteLine("Deselected: " + e.TabPage.Name)
    End Sub

    Private Sub TabControl1_Selected(ByVal sender As Object, ByVal e As System.Windows.Forms.TabControlEventArgs) Handles TabControl1.Selected
        CurrentTab = e.TabPage
        Debug.WriteLine("Selected: " + e.TabPage.Name)
    End Sub

    Private Sub TabControl1_Selecting(ByVal sender As Object, ByVal e As System.Windows.Forms.TabControlCancelEventArgs) Handles TabControl1.Selecting
        If CurrentTab Is Nothing Then Return
        Debug.WriteLine(String.Format("Proposed change from {0} to {1}", CurrentTab.Name, e.TabPage.Name))
    End Sub

End Class
2 голосов
/ 24 августа 2009

Я считаю, что флаг e.Cancel в событии выбора должен сделать этот трюк. При отмене отправка выбранной вкладки возвращается к оригиналу:

    private void tabControl1_Selecting( object sender, TabControlCancelEventArgs e )
    {
        int badIndex = 0;

        if ( tabControl1.SelectedIndex == badIndex )
            e.Cancel = true;            
    }

Если вам действительно нужен более сложный beharvior, подкласс управления вкладкой будет работать, а затем переопределите метод onSelecting. Это не должно быть сделано легко. Если управление будет изменено в будущем, у вас будет неработающий код. И вы должны подтвердить, что все поведение вкладки элемента управления (то есть конструкторы ...)

РЕДАКТИРОВАТЬ: на основе обратной связи. Это позволит внутренне отслеживать исходную вкладку перед выбором.

public class MyTab : System.Windows.Forms.TabControl
{
    int _previousTab;

    protected override void OnSelecting( TabControlCancelEventArgs e )
    {
        // Some logic here to do cool UI things, perhaps use _previousTab

        // Call the base method
        base.OnSelecting( e );           
    }
    protected override void OnDeselecting( TabControlCancelEventArgs e )
    {
        // Store the value for use later in the chain of events
        _previousTab = this.SelectedIndex;

        // Call the base method
        base.OnDeselecting( e );
    }

}
1 голос
/ 14 июля 2014

Попробуйте это в Deselect_Event:

private void tabControl1_Deselected(object sender, TabControlEventArgs e)
{
    var test = e.TabPage.Text;
}
1 голос
/ 02 апреля 2013

В tabControl есть закрытый член lastSelection, в котором есть нужная информация К сожалению, я не вижу способа добраться до него. Очень расстраивает, когда у них есть то, что вы хотите, но не позволяете вам это использовать.

1 голос
/ 24 августа 2009

Чтобы предоставить альтернативу моему первоначальному ответу ... вот пример расширенного TabControl, который изменяет аргументы события, чтобы включить некоторые дополнительные детали.

Отказ от ответственности Это объединено, наверняка потребуются некоторые корректировки!

Option Strict On
Option Explicit On

Imports System
Imports System.Windows.Forms

Public Class ExtendedTabControl
    Inherits TabControl

    Public Shadows Event Selecting As EventHandler(Of SelectedTabChangingEventArgs)
    Public Shadows Event Selected As EventHandler(Of SelectedTabChangedEventArgs)

    Private _PreviousTab As TabPage
    Public Property PreviousTab() As TabPage
        Get
            Return _PreviousTab
        End Get
        Private Set(ByVal value As TabPage)
            _PreviousTab = value
        End Set
    End Property

    Private _CurrentTab As TabPage
    Public Property CurrentTab() As TabPage
        Get
            Return _CurrentTab
        End Get
        Private Set(ByVal value As TabPage)
            _CurrentTab = value
        End Set
    End Property

    Protected Overrides Sub OnDeselected(ByVal e As System.Windows.Forms.TabControlEventArgs)
        PreviousTab = e.TabPage
        MyBase.OnDeselected(e)
    End Sub

    Protected Overrides Sub OnSelected(ByVal e As System.Windows.Forms.TabControlEventArgs)
        CurrentTab = e.TabPage
        Dim selectedArgs As New SelectedTabChangedEventArgs(e, PreviousTab)
        RaiseEvent Selected(Me, selectedArgs)
    End Sub

    Protected Overrides Sub OnSelecting(ByVal e As System.Windows.Forms.TabControlCancelEventArgs)
        Dim selectedArgs As New SelectedTabChangingEventArgs(e, CurrentTab)
        RaiseEvent Selecting(Me, selectedArgs)
    End Sub

End Class

Public Class SelectedTabChangingEventArgs
    Inherits TabControlCancelEventArgs

    Public Sub New(ByVal selectingEventArgs As TabControlCancelEventArgs, ByVal previousTabPage As TabPage)
        MyBase.New(selectingEventArgs.TabPage, selectingEventArgs.TabPageIndex, selectingEventArgs.Cancel, selectingEventArgs.Action)
        Me.CurrentTab = previousTabPage
    End Sub

    Private _CurrentTab As TabPage
    Public Property CurrentTab() As TabPage
        Get
            Return _CurrentTab
        End Get
        Set(ByVal value As TabPage)
            _CurrentTab = value
        End Set
    End Property

End Class

Public Class SelectedTabChangedEventArgs
    Inherits TabControlEventArgs

    Public Sub New(ByVal selectedEventArgs As TabControlEventArgs, ByVal previousTabPage As TabPage)
        MyBase.New(selectedEventArgs.TabPage, selectedEventArgs.TabPageIndex, selectedEventArgs.Action)
        Me.PreviousTab = previousTabPage
    End Sub

    Private _PreviousTab As TabPage
    Public Property PreviousTab() As TabPage
        Get
            Return _PreviousTab
        End Get
        Set(ByVal value As TabPage)
            _PreviousTab = value
        End Set
    End Property

End Class

... и образец формы с использованием этого элемента управления ...

Option Strict On
Option Explicit On

Public Class Form1

    Private Sub TabControl1_Selecting(ByVal sender As Object, ByVal e As SelectedTabChangingEventArgs) Handles TabControl1.Selecting
        If e.CurrentTab Is Nothing Then Return
        Console.WriteLine(String.Format("Proposed change from {0} to {1}", e.CurrentTab.Name, e.TabPage.Name))
    End Sub

    Private Sub TabControl1_Selected(ByVal sender As Object, ByVal e As SelectedTabChangedEventArgs) Handles TabControl1.Selected
        Console.WriteLine(String.Format("Changed from {0} to {1}", e.PreviousTab.Name, e.TabPage.Name))
    End Sub

End Class
1 голос
/ 24 августа 2009

Вы можете сделать что-то подобное:

    private int _oldIndex = -1;

    private void tabControl1_Deselected(object sender, TabControlEventArgs e)
    {
        _oldIndex = e.TabPageIndex;
    }

    private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
    {
        if (_oldIndex != -1)
        {
            if (CanChangeTab(_oldIndex, e.TabPageIndex))
            {
                e.Cancel = true;
            }
        }
    }

    private bool CanChangeTab(int fromIndex, int toIndex)
    {
        // Put your logic here
    }
1 голос
/ 24 августа 2009

Вы можете получить индекс вкладки, от которой пользователь удаляется, с событием Отмена выбора и сохранить его в переменной для дальнейшего использования:

Private Sub TabControl1_Deselecting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TabControlCancelEventArgs) Handles TabControl1.Deselecting
    someClassLevelVariable = e.TabPageIndex
End Sub

Вы хотите поставить код, чтобы предотвратить переключение в событии выбора. Вот пример в VB.NET, который не позволит вам выбрать вкладку 2 в элементе управления вкладками:

Private Sub TabControl1_Selecting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TabControlCancelEventArgs) Handles TabControl1.Selecting
    If (e.TabPageIndex = 1) Then
        e.Cancel = True
    End If
End Sub
1 голос
/ 24 августа 2009

Вы можете подписаться на TabControl.Deselecting . При запуске индекс табуляции в аргументах события будет иметь старый индекс.

Затем вы можете подписаться на TabControl.Selected . Когда происходит это событие, индекс вкладки будет индексом новой выбранной вкладки.

...