2010-04-01 89 views
8

如何以編程方式重新排列TabControl中的標籤?我需要根據某些條件對選項卡進行排序。以編程方式更改標籤順序

如果可以通過設計器進行重新排序,我想我們必須能夠在運行時通過代碼來完成它。

回答

7

您必須重新定義您的標籤頁集合,才能更改標籤頁的索引。

+0

redefine?你能詳細說一下嗎?是否像我必須刪除所有可用的標籤,然後按照我想要的順序添加它們? – Aneef 2010-04-01 09:18:39

+0

你可能看到過這樣的東西:tabControl.Controls.Add(tabPage);你必須簡單地改變ControllCollection中的標籤頁的順序(就像你對其他任何一個集合所做的那樣)。 – thelost 2010-04-01 09:29:41

+0

這是我所做的,正如我在我以前的評論中說的那樣刪除它們並重新排序,因爲我想我們可以做一些排序或smt *嘆息*:P,無論如何感謝 – Aneef 2010-04-01 09:51:59

9
  1. 創建一個新窗體。
  2. 創建一個新的TabControl。
  3. 注意它有兩個TabPage控件,並且TabPage1是第一個選項卡。
  4. 在窗體的Load事件,添加
    • this.TabControl1.TabPages.Remove(this.TabPage2)
    • this.TabControl1.TabPages.Insert(0, this.TabPage2)
  5. 運行形式。
  6. 注意TabPage2現在是第一個選項卡。

請注意,如果您無法刪除標籤頁,它仍會顯示在其舊位置。換句話說,您將在同一個標​​籤頁上有兩個標籤。

5

thelost是對的。以下是一個快速示例代碼。

我有2片(tabpage1,tabpag2)

然後我聲明兩個的TabPages和現有標籤存儲在其中的一個的TabControl標籤控制。

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

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

然後點擊一個按鈕,我刪除使用

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

的標籤現在,如果你想改變順序,那麼你將有頂級它的順序添加到標籤

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

注意:這是未經測試的快速代碼。

1

裏面去Designer.cs文件

在那裏,你會發現

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

的添加順序是你的TabPages'在TabControl的順序。改變你的意願。刪除並添加TabControl.Controls的功能將幫助您Shoban回答。

+1

不是sendToBack和BringToFront應該改變zorder位置?即,如果直接在此頁面的頂部有一個控件,並且您在頁面上確實帶有ToFront,那麼您將看到該頁面不是之前位於該頁面頂部的對象。這聽起來像是在暗示這些函數會重新排列標籤的位置。 – Chris 2012-06-14 15:22:01

+0

@Chris明天我會檢查,你可能是對的。 – icaptan 2012-06-14 21:56:36

+0

@Chris你說得對,我已經測試過BringToFront。它適用於FlowLayoutPanel,但不適用於TabControl。 – icaptan 2012-06-15 16:47:43

1

在Initilizacomponent()後面試試。這段代碼可以讓你自由地在.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

下面的代碼行也可以做的伎倆,這種解決方案也適用於其他類型的數據有排序的沒有直接的方法: - 轉換到一個列表 - 排序列表 - 把它放回

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

多麼美妙的解決方案。 – 2016-02-20 08:19:12

0

有時我有tabControls與幾個tabPages。在運行時,tabPages會變得不可見(通過刪除它們),然後再次添加。

在此之後,tabPages可能是錯誤的順序。我使用此代碼對它們進行再次排序:

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(); 
} 
相關問題