2010-04-01 7 views
8

TabControl의 탭을 프로그래밍 방식으로 재정렬하려면 어떻게합니까? 조건에 따라 탭을 정렬해야합니다.프로그래밍 방식으로 탭 순서 변경

디자이너를 통해 재정렬을 수행 할 수 있다면 런타임시 코드를 통해이를 수행 할 수 있어야합니다.

답변

7

탭 페이지의 색인을 변경하려면 탭 페이지 모음을 다시 정의해야합니다.

+0

재정의 하시겠습니까? 당신은 조금을 정성 들일 수 있습니까? 내가 사용할 수있는 모든 탭을 제거한 다음 원하는 순서대로 추가해야하는 것입니까? – Aneef

+0

다음과 같이 보았을 수도 있습니다. tabControl.Controls.Add (tabPage); 다른 컬렉션과 마찬가지로 ControllCollection의 탭 페이지 순서를 변경해야합니다. – thelost

+0

글쎄,이게 내가 한 일이다. 내가 이전에 한 말로 그걸 제거하고 내가 원하는대로 재주문을하면, 우리는 정렬이나 smt * 한숨을 할 수 있다고 생각했다. : P, 어쨌든 고마워. – Aneef

9
  1. 새 양식을 만드십시오.
  2. 새 TabControl을 만듭니다.
  3. TabPage 컨트롤이 두 개 있고 TabPage1이 첫 번째 탭임을 확인하십시오. 폼의 Load 이벤트에서
  4. ,
    • this.TabControl1.TabPages.Remove(this.TabPage2)
    • this.TabControl1.TabPages.Insert(0, this.TabPage2)
  5. 실행 양식을 추가 할 수 있습니다.
  6. 알림 TabPage2가 이제 첫 번째 탭입니다.

탭 페이지를 제거하지 못하면 이전 위치에 계속 표시됩니다. 즉, 동일한 탭 페이지에 대해 두 개의 탭을 갖게됩니다.

5

thelost가 맞습니다. 다음은 간단한 샘플 코드입니다.

는 I 2 개 탭 (tabpage1, tabpag2)

그럼 I 두 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 당신은 추가 주문이있는 TabControl에 tabpages '순서입니다

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

찾을 수있다

파일. 원하는대로 주문을 변경하십시오. Shoban이 답변 한대로 TabControl.Controls의 기능을 제거하고 추가하면 도움이됩니다.

+1

sendToBack 및 BringToFront는 zorder positon을 변경해야합니까? 즉,이 탭 페이지의 직접 온타리오 컨트롤이 있고 탭 페이지에서 bringToFront를했으면 이전에 탭 페이지가 아닌 이전의 탭 페이지가 표시됩니다. 이 함수는 대신 탭의 위치를 ​​다시 지정하라는 제안을하는 것처럼 들립니다. – Chris

+0

@Chris 내일 확인해 보겠습니다. 맞을지도 모릅니다. – icaptan

+0

@Chris 당신 말이 맞아요. 전 BringToFront를 테스트했습니다. FlowLayoutPanel에서는 작동하지만 TabControl에서는 작동하지 않습니다. – icaptan

1

Initilizacomponent() 후에 시도하십시오. 이 코드는 프로그래밍 방식으로 .cs 파일에서 자유롭게 변경할 수있는 코드를 제공합니다.

3

또한 트릭을 할, 이러한 유형의 솔루션은 또한 정렬 직접적인 방법이 없습니다 데이터의 다른 종류의 작동 할 수있는 코드의 다음 줄

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

     this.tabReceive.Controls.Add(this.metroTabPage4); 
     this.tabReceive.Controls.Add(this.metroTabPage5); 
: 을 - 목록 로 변환 - 목록 을 정렬 - 다시 넣기

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

정말 환상적인 솔루션입니다. –

0

간혹 가끔 tabProls에 여러 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(); 
} 
관련 문제