[英]How do I tell which tab you are moving from/to in a WinForms tab control?
我需要確定用戶來自哪個選項卡,以及切換選項卡時可能取消切換的選項卡。 我嘗試了取消選擇,取消選擇,選擇,選定事件,並且所有這些事件都顯示e.TabPageIndex與sender.SelectedIndex相同。
是否存在可以使用的事件或屬性,以便我可以確定其中的兩個方面,或者我是否必須通過從一個事件緩存它並在新事件中使用該值來破解某些內容。
我試圖避免處理取消選擇/取消選擇的事件並緩存要在選擇事件中使用的值。 我已經知道我可以做到這一點,所以我問是否有一種更清潔的方式,而不是這樣做。
我曾在C#和VB中嘗試過,結果相同(毫不奇怪)。
謝謝。
它看起來不像任何一個事件參數將包含前一個和當前選項卡的詳細信息,因此您需要處理幾個事件以跟蹤。
至少,您需要使用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
我相信選擇事件中的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 );
}
}
您可以訂閱TabControl.Deselecting 。 當它觸發時,事件args中的選項卡索引將是舊索引。
然后,您可以訂閱TabControl.Selected 。 觸發此事件時,選項卡索引將是新選擇的選項卡的索引。
您可以使用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
}
為我的初始答案提供替代....這是一個擴展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
tabControl有一個非公共成員“lastSelection”,它包含您想要的信息。 不幸的是,我沒有辦法找到它。 當他們擁有你想要的但卻不讓你使用它時,這是非常令人沮喪的。
在Deselect_Event中嘗試這個:
private void tabControl1_Deselected(object sender, TabControlEventArgs e)
{
var test = e.TabPage.Text;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.