Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用for循环在c#中重新排序选项卡页_C# - Fatal编程技术网

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

使用for循环在c#中重新排序选项卡页,c#,C#,嗨,伙计们,我正试图改变标签页的顺序,但不管我做什么,我都失败了 我总共有24页,我想做的是 保持前5个选项卡页面不变(索引0到4将保持不变),并将页面16到23(索引15到22)移动到索引5处 所以它应该是这样的: 索引: 01 2 3 4 5 6 7 8 9 10 11 12 13 15 16 18 19 20 21 22 23 页码: 12345161819192122323678910111213151524 为了完成此任务,我尝试使用以下代码: for (int i = 23; i &

嗨,伙计们,我正试图改变标签页的顺序,但不管我做什么,我都失败了

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

保持前5个选项卡页面不变(索引0到4将保持不变),并将页面16到23(索引15到22)移动到索引5处

所以它应该是这样的:

索引:

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

页码:

12345161819192122323678910111213151524

为了完成此任务,我尝试使用以下代码:

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

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

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

loTabPage = this.myCustomTab.TabPages[i];
this.myCustomTab.TabPages.RemoveAt(i);
应该是:

loTabPage = this.myCustomTab.TabPages[23];
this.myCustomTab.TabPages.RemoveAt(23);
插入时,位于
22
的项目现在将被推送到
23


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

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

loTabPage = this.myCustomTab.TabPages[i];
this.myCustomTab.TabPages.RemoveAt(i);
应该是:

loTabPage = this.myCustomTab.TabPages[23];
this.myCustomTab.TabPages.RemoveAt(23);
插入时,位于
22
的项目现在将被推送到
23


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

现在没有编译器,但希望类似的方法可以工作:

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;
var tabs=newlist();
tabs.AddRange(myCustomTab.TabPages/*.of type(TabPage)*/);
var指数=新的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};
对于(选项卡中的变量选项卡)选项卡。父级=空;
对于(索引中的变量i)选项卡[i]。父级=myCustomTab;

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

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

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;
var tabs=newlist();
tabs.AddRange(myCustomTab.TabPages/*.of type(TabPage)*/);
var指数=新的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};
对于(选项卡中的变量选项卡)选项卡。父级=空;
对于(索引中的变量i)选项卡[i]。父级=myCustomTab;

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

您的反向迭代使其成为一个移动目标,而且基本上没有必要,因为您真正想做的是将八个选项卡从后面移动到索引五,因此:

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

您的反向迭代使其成为一个移动的目标,而且基本上没有必要,因为您真正想要做的就是将八个选项卡从后面移动到索引五,因此:

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

我发现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);
var tabs=tabControl.TabPages.OfType().ToArray();
var bringForward=制表符。跳过(15)。取(8);
制表符=制表符。取(5)
.工会(带来前进)
.Union(制表符)
.ToArray();
tabControl.TabPages.Clear();
tabControl.TabPages.AddRange(制表符);
(当然,在using语句中需要一个
using System.Linq;


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

我发现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);
var tabs=tabControl.TabPages.OfType().ToArray();
var bringForward=制表符。跳过(15)。取(8);
制表符=制表符。取(5)
.工会(带来前进)
.Union(制表符)
.ToArray();
tabControl.TabPages.Clear();
tabControl.TabPages.AddRange(制表符);
(当然,在using语句中需要一个
using System.Linq;


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

如何失败?crah,什么也不做,顺序不对??首先显示零基索引,然后显示一基索引-这是什么?@Igor它看起来像
index=0
对应于第1页,
index=5
对应于第16页,等等。相关:如何失败?crah,什么也不做,顺序不对??首先你显示的是基于零的索引,然后是基于一的索引-这是什么?@Igor它看起来像
index=0
对应于第1页,
index=5
对应于第16页,等等。相关:您好,先生,这对我帮助很大,在我的控制台上,我可以看到页面的顺序与我希望的一样,但是在程序窗口中,插入的选项卡不可见。你知道为什么吗?@user3456351它们在我的屏幕上可见,所以我不知道你的代码看起来像什么,这会导致这种情况。您好,先生,这对我帮助很大,在我的控制台上,我可以看到页面的顺序与我希望的一样,但是在程序窗口中,插入的选项卡不可见。你知道为什么吗?@user3456351它们在我的屏幕上可见,所以我不知道你的代码看起来像什么,这会导致这种情况。