大家好我试图改变标签的顺序,但无论我做什么,我都失败了。
我总共有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);
}
但是上面的代码失败了,有什么建议吗?
答案 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()
选择不同元素的属性,即不添加重复项。