2010-05-28 3 views
20

Ich ermittle gerade, welche Seite eines Tabcontrols über das Ereignis SelectedIndexChanged angeklickt wurde.Wie erkenne ich eine Änderung der Registerkarte in TabControl vor dem SelectedIndexChanged-Ereignis?

Ich möchte vor der ausgewählte Index tatsächlich zu Validierungszwecken ändert erkennen. Ein Benutzer klickt beispielsweise auf eine andere Registerkarte als die gerade angezeigte Registerkarte. Wenn die Formulardaten nicht gespeichert sind, wird ein Dialogfeld angezeigt, in dem Sie gefragt werden, ob Sie fortfahren möchten. Wenn der Benutzer auf Nein klickt, sollte der Benutzer auf der aktuellen Registerkarte bleiben.

Momentan muss ich mich an die vorherige Registerkarte erinnern und nach einer Antwort von 'no' wieder zurückschalten.

Ich dachte MouseDown (und die sortierte Berechnungslogik), aber ich bezweifle, dass das der beste Weg ist.

Antwort

28

hinzufügen, ein solches Ereignis zum TabControl wenn 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; 
} 
+0

Genau das Ereignis, das ich suchte (und anscheinend nicht sah). Vielen Dank. – JYelton

+4

Die 'aktuelle' TabPage, die Sie hier haben, ist nicht die, die Sie validieren möchten (es ist die neue). Die vorherige TabPage muss z. im ausgewählten Ereignis. – Gerard

+0

Ich musste das eigentlich selbst machen und fand auch, dass Sie die Tab-Validierung nach Chris Schmichs Antwort verwenden müssen. Weder die ausgewählten, noch die ausgewählten (TabIndexChanged oder SelectedIndexChanged) Ereignisse verweisen auf die aktuelle Registerkarte. – mattpm

6

Die TabControl hat eine Sammlung von TabPages, von denen jede Sie Validierung, zB erzwingen können:

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; 
    } 
} 
+1

Ich habe Validierungsereignisse zuvor verwendet und es erneut betrachtet, aber für die Zwecke dieser Anwendung ist es mehr als ich brauche. Danke aber. – JYelton

3

Ich habe tatsächlich alle Ereignisse einschließlich der Vorschläge hier ausprobiert und keines der erwähnten Ereignisse zur richtigen Zeit auftritt, um tatsächlich das Verschieben von der Registerkarte zu verhindern.

Auch das Tabulatorüberprüfungs-Ereignis wird ausgelöst, wenn ich die Registerkarte betrete, anstatt sie zu verlassen - entweder das oder etwas Eigenartiges mit meinem Rechner oder .NET 4. Andererseits gibt es in .NET 4 das Deselecting-Ereignis die zum richtigen Zeitpunkt für meine Zwecke feuert.

Verwandte Themen