Я исследовал выпуск программ для чтения с экрана и таблиц несколько лет назад и придумал информацию, которая противоречит тому, чему верит большинство разработчиков:
http://www.webaim.org/techniques/tables/
"Вы, вероятно, услышите, что некоторые защитники доступности говорят, что таблицы расположения являются плохой идеей, и что методы расположения CSS должны использоваться вместо этого. Существует истина в том, что они говорят, но, честно говоря, использование таблиц для расположения не является худшей вещью, которую Вы могли сделать с точки зрения доступности. Люди со всеми видами нарушений могут легко получить доступ к таблицам, пока таблицы разработаны с доступностью в памяти".
Не похоже, что какой-либо один аргумент события будет содержать сведения как о предыдущей, так и о текущей вкладках, поэтому вам нужно будет обработать пару событий для отслеживания.
Как минимум, необходимо использовать событие 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
Вы можете подписаться на TabControl.Deselecting . Когда он срабатывает, индекс вкладки в аргументах события будет старым.
Затем вы можете подписаться на TabControl.Selected . При возникновении этого события индекс вкладки будет индексом только что выбранной вкладки.
Я считаю, что флаг e.Cancel в событии выбора должен сделать этот трюк. Это отправляет выбранную вкладку обратно в исходную при отмене:
private void tabControl1_Selecting( object sender, TabControlCancelEventArgs e )
{
int badIndex = 0;
if ( tabControl1.SelectedIndex == badIndex )
e.Cancel = true;
}
Если вам действительно нужно более сложное поведение, подклассы элемента управления вкладкой будут работать. Затем переопределите метод 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 );
}
}
Вы можете получить индекс вкладки, от которой пользователь переходит, с помощью события Deselecting и сохранить его в переменной для дальнейшего использования:
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
Вы можете сделать что-то вроде этого:
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
}
To provide an alternative to my initial answer.... here's a sample of an extended TabControl which modifies the event arguments to include some more details.
Disclaimer This is slapped together, it'll need some adjustments for sure!
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
...and a sample Form using this control...
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