2010-04-01 22 views
8

Come riordinare le schede in modo programmatico in un TabControl? Ho bisogno di ordinare le schede a seconda di alcune condizioni.Modifica programmata dell'ordine di tabulazione

Se è possibile effettuare il riordino attraverso il progettista, suppongo che dobbiamo essere in grado di farlo anche tramite codice in fase di esecuzione.

risposta

7

È necessario ridefinire la raccolta di schede, al fine di modificare l'indice delle pagine di tab.

+0

ridefinire? puoi elaborare un po '?? è come devo rimuovere tutte le schede disponibili e quindi aggiungerle nell'ordine che voglio? – Aneef

+0

Potresti aver visto qualcosa di simile: tabControl.Controls.Add (tabPage); Devi semplicemente cambiare l'ordine delle pagine delle schede in ControllCollection (come faresti con qualsiasi altra raccolta). – thelost

+0

beh, questo è quello che ho fatto, come ho detto nel mio precedente commento rimuoverli e riordinarli come volevo, ho pensato che potevamo fare qualche sorting o smt * sigh *: P, grazie comunque – Aneef

9
  1. Creare un nuovo modulo.
  2. Creare un nuovo TabControl.
  3. Avviso ha due controlli TabPage e TabPage1 è la prima scheda.
  4. nell'evento Load del form, aggiungere
    • this.TabControl1.TabPages.Remove(this.TabPage2)
    • this.TabControl1.TabPages.Insert(0, this.TabPage2)
  5. Eseguire il form.
  6. Avviso TabPage2 è ora la prima scheda.

Si noti che se non si riesce a rimuovere la scheda, verrà comunque visualizzato nella sua posizione precedente. In altre parole, avrai due schede della stessa tabpage.

5

thelost è giusto. Di seguito è riportato un codice di esempio rapido.

Ho un controllo scheda con 2 alette (TabPage1, tabpag2)

Poi dichiarare due tabpages e memorizzare le schede esistenti nel TabControl in esso.

abPage tbp1 = new TabPage(); 
TabPage tbp2 = new TabPage(); 

tbp1 = tabControl1.TabPages[0]; 
tbp2 = tabControl1.TabPages[1]; 

Poi un clic del pulsante ho rimosso le schede utilizzando

tabControl1.TabPages.Remove(tabControl1.TabPages[0]); 

Ora, se si desidera modificare l'ordine, allora si avrà top aggiungerlo alla scheda in questo ordine

//Order changed  
tabControl1.TabPages.Add(tbp2); 
tabControl1.TabPages.Add(tbp1); 

Nota: questo è un codice rapido non verificato. il file

Ci

1

andare dentro Designer.cs troverete

/// [Your TabControl Name] 
yourTabControl.Controls.Add(yourPage1); 
yourTabControl.Controls.Add(yourPage2); 
yourTabControl.Controls.Add(yourPage3); 

Ordine aggiunta è ordine tuoi TabPages' nel TabControl. Cambia l'ordine come desideri. Rimuovi e aggiungi le funzioni di TabControl.Controls ti aiuterà come Shoban ha risposto.

+1

Non è sendToBack e BringToFront si suppone che cambi la posizione zorder? vale a dire se c'è un controllo direttamente ontop di questa pagina, e hai fatto portareToFront sulla tabpage, allora vedresti la pagina non l'oggetto che era in precedenza su di essa. Sembra che tu stia suggerendo che queste funzioni invece riordinano la posizione delle schede. – Chris

+0

@Chris lo controllerò domani, potresti avere ragione. – icaptan

+0

@Chris hai ragione, ho testato BringToFront. Funziona con FlowLayoutPanel, ma non con TabControl. – icaptan

1

provare questo dopo Initilizacomponent(). questo codice ti darà la libertà di cambiarlo in modo programmatico nel file .cs.

 this.tabReceive.Controls.Remove(this.metroTabPage4); 
     this.tabReceive.Controls.Remove(this.metroTabPage5); 

     this.tabReceive.Controls.Add(this.metroTabPage4); 
     this.tabReceive.Controls.Add(this.metroTabPage5); 
3

Le seguenti righe di codice può anche fare il trucco, questo tipo di soluzione funziona anche per altri tipi di dati che non ha modo diretto di smistamento: - convertire in un elenco - ordinare l'elenco - metterlo di nuovo

public static void Sort(TabControl tabControl) 
{ 
    var tabList = tabControl.TabPages.Cast<TabPage>().ToList(); 
    tabList.Sort(new TabPageComparer()); 
    tabControl.TabPages.Clear(); 
    tabControl.TabPages.AddRange(tabList.ToArray()); 
} 

public class TabPageComparer : IComparer<TabPage> 
{ 
    public int Compare(TabPage x, TabPage y) 
    { 
     return string.Compare(x.Text, y.Text); 
    } 
} 
+0

Che fantastica soluzione. –

0

A volte ho tabControls con diverse tabPages. Alla scheda runtime le pagine vengono rese invisibili (rimuovendole) e aggiunte di nuovo in seguito.

Dopo questo il tabPages potrebbe essere nell'ordine sbagliato. Uso questo codice per ridistribuirli nuovamente:

public void ReorderTabPages() 
{ 
    // Demo code to reorder tabControl with tabPages 
    // where some tabPages may be unwanted at the moment 

    // caution: events like "SelectedIndexChanged" does fire! 

    // List of wanted tab pages 
    List<TabPage> wantedTabPages = new List<TabPage>(); 

    // remember the current selected tab 
    TabPage currentTabPage = this.tabControl.SelectedTab; 

    // check if all possibly active tabs are currently visible 
    // check it in the order they should be displayed 
    // after that they are in the correct order in "wantedTabPages" 
    if (this.tabControl.TabPages.IndexOf(this.tabPage_01) >= 0) 
     wantedTabPages.Add(this.tabPage_01); 
    if (this.tabControl.TabPages.IndexOf(this.tabPage_02) >= 0) 
     wantedTabPages.Add(this.tabPage_02); 
    if (this.tabControl.TabPages.IndexOf(this.tabPage_03) >= 0) 
     wantedTabPages.Add(this.tabPage_03); 
    if (this.tabControl.TabPages.IndexOf(this.tabPage_04) >= 0) 
     wantedTabPages.Add(this.tabPage_04); 

    this.tabControl.SuspendLayout(); 

    // remove all currently visible tab pages 
    for (int i = this.tabControl.TabPages.Count - 1; i >= 0; i--) 
     this.tabControl.TabPages.RemoveAt(i); 

    // add the tabPages in the correct order 
    foreach (var wantedPage in wantedTabPages) 
     this.tabControl.TabPages.Add(wantedPage); 

    // restore the currently selected tabPage 
    this.tabControl.SelectedTab = currentTabPage; 

    this.tabControl.ResumeLayout(); 
} 
Problemi correlati