以编程方式更改选项卡顺序。

11

如何通过编程重新排序 TabControl 中的选项卡?我需要根据一些条件对选项卡进行排序。

如果可以通过设计器进行重新排序,那么我认为我们也应该能够在运行时通过代码实现它。

7个回答

11
  1. 创建一个新表单。
  2. 创建一个新的TabControl。
  3. 注意它有两个TabPage控件,TabPage1是第一个选项卡。
  4. 在表单的Load事件中添加
    • this.TabControl1.TabPages.Remove(this.TabPage2)
    • this.TabControl1.TabPages.Insert(0, this.TabPage2)
  5. 运行表单。
  6. 注意现在TabPage2是第一个选项卡。

请注意,如果您未能删除选项卡页,则它仍将显示在其旧位置。换句话说,您将拥有相同选项卡页的两个选项卡。


9
你需要重新定义你的标签页集合,以便更改标签页的索引。

重新定义?您能详细说明一下吗?是不是要删除所有现有的选项卡,然后按照想要的顺序添加它们? - Aneef
你可能已经看到过这样的代码:tabControl.Controls.Add(tabPage); 你只需要改变 ControllCollection 中选项卡页面的顺序(就像你处理其他集合一样)。 - thelost
好的,这就是我所做的,正如我在之前的评论中所说,将它们删除并按照我想要的重新排序,我认为我们可以进行一些排序或其他操作 叹气 :P,无论如何还是谢谢。 - Aneef
你也可以进行排序。你只需要为ControllCollection实现一个比较器方法即可。 - thelost

6
以下代码行也可以解决问题,这种解决方案也适用于其他无法直接排序的数据类型: - 转换为列表 - 对列表进行排序 - 将其放回
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);
    }
}

多么棒的解决方案。 - Ganesh Kamath - 'Code Frenzy'

5

thelost是正确的。以下是一个快速的示例代码。

我有一个带有2个选项卡(tabpage1,tabpag2)的选项卡控件。

然后我声明两个选项卡并将现有选项卡存储在其中的选项卡控件中。

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
在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);

1

进入Designer.cs文件

在那里你会找到

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

添加顺序是选项卡页在选项卡控件中的顺序。按照您的意愿更改顺序即可。TabControl.Controls 的删除和添加功能将像 Shoban 回答的那样帮助您。


1
“sendToBack”和“BringToFront”不应该改变zorder位置吗?例如,如果有一个控件直接在这个选项卡上面,而你在选项卡上执行了“BringToFront”,那么你会看到选项卡而不是之前在它上面的对象。这里听起来像是你在暗示这些函数实际上重新排列选项卡的位置。 - Chris
@Chris 你说得对,我已经测试了BringToFront。它适用于FlowLayoutPanel,但不适用于TabControl。 - icaptan
这个答案也是我能找到的编程方式改变选项卡顺序的唯一方法。你只需要关闭设计视图,更改顺序,编译,然后打开设计视图,新的顺序就会生效。 - Mark Meuer

0
有时我会使用带有多个选项卡页面的选项卡控件。在运行时,通过将它们删除并稍后再添加,可以使选项卡页面不可见。
之后,选项卡页面可能会处于错误的顺序。我使用以下代码来重新排序它们:
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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接