none
TabPages ein-/ausblenden RRS feed

  • Frage

  • Hallo zusammen,

    wie kann ich eigentlich einzelne TabPages ein-/ausblenden? Ich sehe hier gar keine Möglichkeit die Visible = false/true zu setzen. Ist das etwa nicht vorgesehen?

    Freitag, 3. September 2010 09:55

Antworten

Alle Antworten

  • Hallo,

    nein, dass ist nicht vorgesehen, weil es das zugrundeliegende native Steuerelement nicht tut.
    Du mußt die TabPage entfernen und wieder hinzufügen,
    Enabled funktioniert im übrigen ebensowenig. Siehe u. a.: 

    TabControl-Steuerelement (Windows Forms)
    How to hide TabPage from TabControl

    Gruß Elmar

    • Als Antwort markiert SPDeveloperXP Freitag, 3. September 2010 11:31
    Freitag, 3. September 2010 10:26
    Beantworter
  • Hallo SP.,

    • Zitat: "Um eine Registerkarte in einem TabControl auszublenden, müssen Sie es aus der TabPages-Auflistung des Steuerelements entfernen."    Quelle: [TabPage.Visible-Eigenschaft (System.Windows.Forms)]

    und das macht man so:

    [Gewusst wie: Hinzufügen und Entfernen von Registerkarten mit dem TabControl-Steuerelement in Windows Forms]
    http://msdn.microsoft.com/de-de/library/zb7xae05.aspx


    ciao Frank
    • Als Antwort markiert SPDeveloperXP Freitag, 3. September 2010 11:31
    Freitag, 3. September 2010 11:18
  • Hhm, da muss man sich ja auch die Reihenfolge merken, wenn man die behalten will. Sehr ungünstig, aber naja, da muss man halt durch ;-)
    Freitag, 3. September 2010 11:31
  • Hallo SP.,

            > Hhm, da muss man sich ja auch die Reihenfolge merken, wenn man die behalten will.

    man kann auch über die Instanz der TabPage mit ihrem Namen gehen, etwa:

      private void btnZufügen_Click(object sender, EventArgs e)
      {
        tabControl1.TabPages.Add(tabPage1);
      }

      private void btnEntfernen_Click(object sender, EventArgs e)
      {
        tabControl1.TabPages.Remove(tabPage1);
      }
    aber gebe Dir Recht, die ursprüngliche Reihenfolge könnte natürlich bei verschiedenen Remove- und Add-Aktionen durcheinander kommen.
    Sowas würde man zum Beispiel über eine darüberliegende Klasse sauber handeln, die die Reihenfolge kennt. Aufruf dann etwa: TabControlManager.SetVisible(tabControl1, tabPage1, true); // o.ä.
    Oder gleich eine MyTabControl Klasse von TabControl ableiten und eine Methode zur Verfügung stellen.


    ciao Frank
    Freitag, 3. September 2010 11:36
  • Hallo SP

    ja, das mit der Reihenfolge (und insbesondere 'verschwindenden' TabPages [bzw umorganisierten Tabs] ) ist in einigen Fällen (subjektiv) unerwünscht  (visuell verwirrend).
    Ist zwar evtl. nicht was du brauchst, aber ich habe jeweils diese Lösung

    How to: Disable Tab Pages
      http://msdn.microsoft.com/en-us/library/252t3cec.aspx

    bevorzugt, wo nur das umschalten auf die 'gesperrte' Tab verhindert wird.
      (ein gesperrter Tab könnte man uU via Text-Zusatz erkennbar machen)

    Freitag, 3. September 2010 11:41
  • Hallo Frank,

    am Besten schreibt man sich dann wohl eine Klasse vom Typ Control und zieht dieses anstelle des TabControls auf ein Form, oder? Was ist aber, wenn man jetzt schon mehrfah das normale Tab-Control verwendet und im Einsatz hat? Was würdest Du dann machen?

    Montag, 6. September 2010 07:39
  • Hallo SP.,

    ich würde wie gesagt eben vielleicht ein MyTabControl- oder besser eine RemovableTabControl-Klasse entwerfen, die von TabControl abgeleitet ist. Normal kann man dann durch günstige Einstellungen der Suche/Ersetzen (STRG-Shift-H) die bestehenden Instanzen manuell umwandeln (sollte nicht viel Aufwand sein - ist normal das beste bis vielleicht 50 TabControls). Du brauchst dabei eben nicht neue Controls auf die Form zu ziehen, sondern benutzt weiter die alten.

     


    ciao Frank
    Montag, 6. September 2010 13:57
  • Aha, das geht natürlich dann wirklich elegant! Ich hatte mich verwirren lassen, weil das neue RemovableTabControl im Grunde sichtbare grafische Oberfläche hat und so hatte ich schon befürchtet, ich müsse nun meine Tabs im Sourcecode-Modus erzeugen. Das wäre sehr mühsam geworden ;-)

     

    Zur Umsetzung: Ich weiß nicht, ob das die richtige Herangehensweise ist, aber ich dachte mir, ich speichere bei einem überschriebenen OnControlAdded die Reihenfolge aller TabPages (alles was über GetItems() kommt). Dann gibt es eine Methode, die per Index das entsprechende Tab entfernt (mein Visible = false). Die Methode sieht z.B. so aus SetTabPageVisible(int index, bool visible). Verwirrend für einen Anwender könnte sein, dass er eine der sichtbaren Tabs mit dem entsprechenden Index entfernen kann und dann bei visible = true aus der originalen Tab-Reihenfolge wieder sichtbar schalten kann. Mir fällt aber nichts besseres ein...

    Zum Einfügen werden beide Auflistungen am jeweiligen Index in einem Durchlauf miteinander verglichen. Sobald sich die beiden Listen orginialTabOrder[i] und TabPages[i] an der Position unterscheiden, wäre das dich richtige Position, um die TabPage wieder per Insert(i, TabPage) einzufügen.

    Wichtig ist mir, dass die Tabs, die angezeigt werden, in der ursprünglichen Reihenfolge zu sehen sind. Das heißt, wenn ich 6 Tabs (1, 2, ..., 6) im Designer einfüge und z.B. Tab 3 und 4 entferne, danach dann wieder Tab 4 einfüge, es direkt nach der 2 und vor der 5 eingefügt wird. Füge ich dann Tab 3 auch noch hinzu, sollte die Reihenfolge 1, 2, 3, 4, 5, 6 wieder da sein.

    Dienstag, 7. September 2010 07:22