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

时间:2015-12-15 17:59:55

标签: c#

大家好我试图改变标签的顺序,但无论我做什么,我都失败了。

我总共有24个页面,我想做的是

保持前5个tabpages不变(索引0到4将保持相同)并将页面16移动到23(索引15到22)在索引5

所以看起来应该是这样的:

指数:

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

页码:

1 2 3 4 5 16 17 18 19 20 21 22 23 6 7 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);
          }

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

4 个答案:

答案 0 :(得分:2)

你的向后迭代使它成为一个移动的目标,并且在很大程度上是不必要的,因为你真正想要做的就是将八个标签从后面移动到索引五,所以:

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

答案 1 :(得分:1)

您的问题是,每次迭代时需要移动的项目始终是最后一项。而不是

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

应该是:

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

当您插入时,22处的项目现在将被推送到23

当然,在一次操作中移除整个块并再次插入它而不是逐个移动会更有效。

答案 2 :(得分: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;

如果不是,请发表评论,我会删除答案。

答案 3 :(得分:0)

我发现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()选择不同元素的属性,即不添加重复项。