2010-04-01 20 views
8

Jak programowo zmienić kolejność kart w urządzeniu TabControl? Muszę sortować zakładki w zależności od pewnych warunków.Programowa zmiana kolejności tabulacji

Jeśli można zmienić kolejność za pomocą projektanta, to myślę, że musimy to zrobić również za pomocą kodu w czasie wykonywania.

Odpowiedz

7

Musisz zmienić definicję kolekcji stron kart, aby zmienić indeks stron kart.

+0

na nowo? możesz trochę rozwinąć? czy muszę usunąć wszystkie dostępne karty, a następnie dodać je w żądanej kolejności? – Aneef

+0

Być może widziałeś coś takiego: tabControl.Controls.Add (tabPage); Musisz po prostu zmienić kolejność stron kart w ControllCollection (tak jak w przypadku każdej innej kolekcji). – thelost

+0

Cóż, to jest to, co zrobiłem, jak powiedziałem w poprzednim komentarzu, usuń je i zamień tak, jak chciałem, myślałem, że możemy zrobić sortowanie lub smt * westchnienie *: P, dzięki i tak – Aneef

9
  1. Utwórz nowy formularz.
  2. Utwórz nowe TabControl.
  3. Zwróć uwagę, że ma dwie kontrolki TabPage, a TabPage1 to pierwsza karta.
  4. W przypadku ładowania formularza dodaj
    • this.TabControl1.TabPages.Remove(this.TabPage2)
    • this.TabControl1.TabPages.Insert(0, this.TabPage2)
  5. Uruchom formularza.
  6. Uwaga TabPage2 jest teraz pierwszą zakładką.

Pamiętaj, że jeśli nie uda ci się usunąć strony z zakładką, będzie ona nadal wyświetlana w jej starej lokalizacji. Innymi słowy, będziesz miał dwie zakładki na tej samej stronie karty.

5

thelost ma rację. Poniżej znajduje się krótki przykładowy kod.

Mam kontroli kartę z 2 kart (tabpage1, tabpag2)

Następnie deklarują dwa tabpages i przechowywać istniejących kart w TabControl w nim.

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

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

Wtedy na przycisku kliknij usunąłem zaczepy pomocą

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

Teraz, jeśli chcesz zmienić kolejność, a następnie trzeba będzie top dodać go do karty w tej kolejności

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

Uwaga: To nie jest przetestowany szybki kod.

1

Wejdź Designer.cs złożyć

Nie znajdziesz

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

Kolejność dodawania jest zamówić tabpages' w TabControl. Zmień kolejność, jak chcesz. Usuń i dodawaj funkcje TabControl.Controls pomoże ci jak odpowiedział Shoban.

+1

Czy sendToBack i BringToFront nie mają zmienić pozycji zorda? tzn. jeśli bezpośrednio na szczycie tej strony znajduje się kontrolka, a na stronie głównej pojawił się element bringToFront, to zakładka nie byłaby obiektem, który był wcześniej na wierzchu. To brzmi tak, jakbyś sugerował, że te funkcje zamiast tego zmieniają kolejność pozycji kart. – Chris

+0

@ Chris, sprawdzę to jutro, możesz mieć rację. – icaptan

+0

@ Chyba masz rację, testowałem BringToFront. Działa dla FlowLayoutPanel, ale nie dla TabControl. – icaptan

1

wypróbuj to po Initilizacomponent(). ten kod da Ci swobodę zmiany programowo w pliku .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

następujących linii kodu można również wykonać trick, tego rodzaju rozwiązanie działa również na innego rodzaju danych, które nie ma bezpośredniego sposobu sortowania: - konwersja do listy - uporządkować listę - odłóż ją ponownie

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

Co za fantastyczne rozwiązanie. –

0

Czasami mam tabControls z kilkoma zakładkami. W czasie wykonywania tabPages są niewidoczne (poprzez ich usunięcie) i dodane później.

Po tym tabPages może być w złej kolejności. Używam tego kodu, aby ponownie zamawiać je ponownie:

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(); 
}