2009-03-08 3 views
1

Ich habe ein TabControl mit 5 Registerkarten, und der Inhalt einer der Registerkarten hängt von einigen Bedingungen oder Modi ab - Manchmal muss es eine Reihe von Steuerelementen zeigen, zu anderen Zeiten sollte es eine völlig andere Reihe von Steuerelementen zeigen.Wie wird eine von zwei Winforms-Registerkarten dynamisch angezeigt?

Was ist der einfachste Weg, dies zu erreichen? Ich habe versucht, zwei verschiedene Registerkarten einzurichten und etwas wie tab.Enabled/Visible zu verwenden - aber konnte solche Attribute auf den Registerkarten nicht finden.

Ich möchte die Möglichkeit, die Betriebsarten wechseln - gehen von der Anzeige einer Registerkarte, um die andere Registerkarte anzuzeigen, und wieder zurück. Wohlgemerkt, ich möchte nicht ändern, welche Registerkarte aktiv ist, ich möchte eine Registerkarte vollständig ausblenden, dann zeigen Sie es und verstecken Sie eine andere Registerkarte.

+0

Könnten Sie versuchen, die Namensgebung in Ordnung zu bringen? Es gibt keine Spalten in TabControls. Ein "Tab mit 5 Spalten" ist etwas mehrdeutig. –

Antwort

1

ich einer eleganten Lösung nicht kennen. Das einfachste für eine kleine Anwendung scheint TabPages.Add/Insert/Remove wie oben vorgeschlagen zu sein.

In unserer großen Anwendung überschreiben wir die TabControl- und die TabPage-Klasse - nennen sie MyTabControl und MyTabPage-- und haben unsere eigene Visible-Eigenschaft hinzugefügt. Die Einstellung tabPage.Visible = false bewirkt, dass sich die Registerkarte selbst aus der tabControl.TabPages-Auflistung entfernt. Wenn Sie die Seite erneut sichtbar machen, wird sie am ursprünglichen Index in die Auflistung des Registerkartensteuerelements eingefügt. Die Eigenschaft "Sichtbar" machte den Rest unseres Codes ein wenig einfacher zu verwalten.

Allerdings machten die Unterklassen unsere MyTabControl-Unterklasse etwas schwieriger zu entwerfen. TabControl.TabPages ist eine TabPageCollection. Der Visual Studio Designer möchte TabPages erstellen und hinzufügen. Wir benötigten es, um unsere MyTabPage-Unterklassen zu halten. Daher haben wir auch eine MyTabPageCollection erstellt.

Wir haben auch viele Orte, wo verschiedene Gruppen von Steuerelementen auf einer Registerkarte je nach Benutzerauswahl sichtbar sind. Wir gruppieren Bedienelemente auf verschiedenen Bedienfeldern und zeigen das Bedienfeld an, das den entsprechenden Einstellungen entspricht.

1

Ich kann nicht glauben, dass ich keine richtige Lösung für etwas so einfach gesehen habe. Ich weiß, in der Vergangenheit habe ich die Tabs angezeigt und ausgeblendet.

tabControl.SelectTab (Index);

Bingo! Kein Entfernen, kein Einfügen und kein Mischen.

-Holt

2

Die verknüpfte Lösung ist unnötig komplex für das, was Sie tun möchten. Hier ist ein Ausschnitt, der macht was du willst. Es basiert auf einem Formular mit 3 oder mehr Registerkarten. Angenommen, Sie möchten entweder Tab 2 oder Tab 3 anzeigen, aber nie beides. Wenn das Formular mehr Registerkarten enthält, werden diese nach den Registerkarten 2 oder 3 angezeigt, sodass Ihre alternierende Registerkarte immer an der gleichen Indexposition angezeigt wird. Nehmen Sie außerdem an, dass auf Tab 1 zwei Radiobuttons namens "tab2button" und "tab3button" angezeigt werden, mit denen umgeschaltet werden kann, welche der Registerkarten angezeigt wird. Das checkchanged-Ereignis für die Optionsfelder würde folgendes enthalten:

   if (this->tab2button->Checked) 
      { 
       if(tabControl1->TabPages->Contains(tabPage3)) 
       { 
        tabControl1->TabPages->Remove(tabPage3); 
       } 
       if(!tabControl1->TabPages->Contains(tabPage2)) 
       { 
        tabControl1->TabPages->Insert(1,tabPage2); 
       } 

      } 
      else if (this->tab3button->Checked) 
      { 
       if(tabControl1->TabPages->Contains(tabPage2)) 
       { 
        tabControl1->TabPages->Remove(tabPage2); 
       } 
       if(!tabControl1->TabPages->Contains(tabPage3)) 
       { 
        tabControl1->TabPages->Insert(1,tabPage3); 
       } 
      } 
Verwandte Themen