【问题标题】:Reordering tabpages in c# with a for loop在 C# 中使用 for 循环重新排序标签页
【发布时间】:2016-03-21 15:50:00
【问题描述】:

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

我一共有24个标签页,我想做的是

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

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

索引:

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

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

【问题讨论】:

  • 失败怎么办? crah,什么都不做,顺序错误??
  • 首先显示从零开始的索引,然后是从一开始的索引 - 是什么?
  • @Igor 看起来 index = 0 对应第 1 页,index = 5 对应第 16 页,等等。

标签: c#


【解决方案1】:

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

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

【讨论】:

  • 嗨,先生,这对我帮助很大,在我的控制台上我可以看到页面的顺序是我希望的,但是在程序窗口中,插入的选项卡不可见任何想法为什么?
  • @user3456351 它们在我的屏幕上可见,所以我不知道你的代码是什么样子会导致这种情况。
【解决方案2】:

您的问题是您需要在每次迭代中移动的项目始终是最后一个项目。所以不是

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

应该是:

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

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

当然,在一次操作中删除整个块并再次插入它比一个接一个地插入要高效得多。

【讨论】:

    【解决方案3】:

    现在没有编译器,但希望这样的东西可以工作:

    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;
    

    如果没有,请发表评论,我将删除答案。

    【讨论】:

      【解决方案4】:

      我发现 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 语句中自然需要一个 using System.Linq;。)

      所以在使用 Linq 只选择了我们想要前移的选项卡之后,我们可以按顺序构建一个非常清晰的数组。我们依赖 Union() 选择不同元素的属性,即不添加重复项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-16
        • 2020-11-29
        • 2015-08-15
        • 1970-01-01
        • 2020-03-22
        • 2018-01-07
        相关资源
        最近更新 更多