使用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 (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()
选择不同元素的特性,即不添加重复元素。