使用for循环重新排序c#中的选项卡页

本文关键字:选项 排序 循环 for 新排序 使用 | 更新日期: 2023-09-27 18:26:58

大家好,我正在尝试更改选项卡的顺序,但无论我做什么都失败了。

我总共有24个选项卡,我想做的是

保持前5个标签页原样(索引0到4将保持不变),并在索引5 处移动页面16到23(索引15到22)

所以它应该看起来像这样:

索引:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23

页码:

1 2 3 4 5 16 17 19 20 21 23 6 8 9 10 11 12 13 14 15 24

为了完成这项任务,我尝试了以下代码:

for (int i = 23; i >= 16; i--)
          {
              TabPage loTabPage;
              loTabPage = this.myCustomTab.TabPages[i];
              this.myCustomTab.TabPages.RemoveAt(i);
              this.myCustomTab.TabPages.Insert(5, loTabPage);
          }

但是上面的代码失败了,有什么建议吗?

使用for循环重新排序c#中的选项卡页

您的反向迭代使它成为一个移动目标,这在很大程度上是不必要的,因为您真正想做的只是将八个选项卡从后面移动到索引五,所以:

for (int i = 0; i < 8; ++i) {
  TabPage tp = tabControl1.TabPages[22];
  tabControl1.TabPages.RemoveAt(22);
  tabControl1.TabPages.Insert(5, tp);
}

您的问题是,每次迭代需要移动的项目总是最后一个项目。所以不是

loTabPage = this.myCustomTab.TabPages[i];
this.myCustomTab.TabPages.RemoveAt(i);

应该是:

loTabPage = this.myCustomTab.TabPages[23];
this.myCustomTab.TabPages.RemoveAt(23);

插入时,位于22的项目现在将被推送到23

当然,在一次操作中移除整个块并再次插入它将比1乘1更有效。

现在没有编译程序,但希望这样的东西能起作用:

var tabs = new List<TabPage>();
tabs.AddRange(myCustomTab.TabPages/*.OfType(TabPage)*/);
var indexes = new int[] {0,1,2,3,4,15,16,17,18,19,20,21,22,5,6,7,8,9,10,11,12,13,14,23};
for (var tab in tabs) tab.Parent = null;
for (var i in indexes) tabs[i].Parent = myCustomTab;

如果没有,请留下评论,我会删除答案。

我发现Linq为这类任务生成了非常清晰的代码。这对我有效:

var tabs = tabControl.TabPages.OfType<TabPage>().ToArray();
var bringForward = tabs.Skip(15).Take(8);
tabs = tabs.Take(5)
           .Union(bringForward)
           .Union(tabs)
           .ToArray();
tabControl.TabPages.Clear();
tabControl.TabPages.AddRange(tabs);

(当然,在使用语句中需要using System.Linq;。)

因此,在使用Linq只选择我们想要提出的选项卡之后,按照顺序,我们可以非常清晰地构建一个数组。我们依赖于Union()选择不同元素的特性,即不添加重复元素。