C# Control.ControlCollection问题

C# Control.ControlCollection问题,c#,winforms,C#,Winforms,我正在使用Microsoft Visual Studio Express 2010 开发Windows窗体应用程序(C#) 我被以下几点迷住了: 我创建了一个用于组织数据的类 namespace Project_Management_Wizard { public class dataStorage { public System.Windows.Forms.Control wizard_tabs; } } 然后我把数据放进去 data.wizard_tabs = new W

我正在使用Microsoft Visual Studio Express 2010 开发Windows窗体应用程序(C#)

我被以下几点迷住了:

我创建了一个用于组织数据的类

namespace Project_Management_Wizard {
public class dataStorage {
    public System.Windows.Forms.Control wizard_tabs;

    }
}
然后我把数据放进去

data.wizard_tabs = new Wizard_Tabs().Controls[0];
向导\u Tabs是一个只有一个控件的表单,即System.Windows.Forms.Tab.control

基本上,现在data.wizard\u tabs是一个Tab.Control,它有几个包含内容的选项卡

然后我取出这些内容并把它们放在另一张表格上

这有助于我组织表单内容

这是我自己做的

   for(int I=0; I < data.wizard_tabs.Controls[Page].Controls.Count; I += 1) {
   this.Controls.Add(data.wizard_tabs.Controls[0].Controls[I]);
   }
成功地将完整的选项卡控件及其所有内容添加到表单中

this.Controls.Add(data.wizard_tabs.Controls[0].Controls[0]);
        this.Controls.Add(data.wizard_tabs.Controls[0].Controls[0]);
        this.Controls.Add(data.wizard_tabs.Controls[0].Controls[1]);
        this.Controls.Add(data.wizard_tabs.Controls[0].Controls[2]);
        this.Controls.Add(data.wizard_tabs.Controls[0].Controls[3]);
        this.Controls.Add(data.wizard_tabs.Controls[0].Controls[4]);
已成功将选项卡中的元素#0添加到表单中

this.Controls.Add(data.wizard_tabs.Controls[0].Controls[0]);
        this.Controls.Add(data.wizard_tabs.Controls[0].Controls[0]);
        this.Controls.Add(data.wizard_tabs.Controls[0].Controls[1]);
        this.Controls.Add(data.wizard_tabs.Controls[0].Controls[2]);
        this.Controls.Add(data.wizard_tabs.Controls[0].Controls[3]);
        this.Controls.Add(data.wizard_tabs.Controls[0].Controls[4]);
似乎给了我第二个元素

不知何故,在访问选项卡的内容后,每2个控件都会被删除

即使控件的计数为9(即选项卡中的所有元素),尝试访问它们也会导致索引外错误

如果有9个元素,您会期望[0][3]…[8]在那里,但[5]…[8]不在那里


似乎已经解决了这个问题,而这个.ControlsAdd()似乎不知怎么搞砸了

非常感谢

但现在我正在寻找一种相对简单的方法

我有要显示为数据的控件集合。向导\u选项卡。控件[0]。控件

那么,是否有一种明确的方式来“this.Controls=data.wizard\u tabs.Controls[0].Controls”


for(int I=0;I<9;I+=1){
this.Controls.Add(data.wizard_tabs.Controls[0].Controls[0]);
}
这似乎也起到了作用

显然,Controls.Add(control)将控件添加到当前元素,并从其读取控件的源中移除该控件,从而折叠从中获取元素的集合

我不知道为什么它这样做完全没有文档记录,也不知道它为什么需要这样做。

显然,Controls.Add(control)将控件添加到当前元素中,并从读取它的源中删除控件,折叠它从中获取元素的集合

我不知道为什么它会这样做,也不知道为什么它需要这样做

解决问题并清楚演示的代码是:

    for(int I=0; I < 9; I += 1) {
    this.Controls.Add(data.wizard_tabs.Controls[0].Controls[0]);
    }
for(int I=0;I<9;I+=1){
this.Controls.Add(data.wizard_tabs.Controls[0].Controls[0]);
}

在迭代集合时修改集合。是的,不太好用。从Count-1向后迭代到0以避免该问题。请考虑把控制从一个容器移到另一个容器的智慧,这是非常不可取的。当您将控件添加到集合中时,它将从其所在的集合中删除。这与此无关,但您是否仍在使用Visual Studio 2010 Express而不是VS2013 Express?我喜欢VS2010,但我没有理由选择VS2013。目前,我正在开发一些有趣且有用的编程程序-代码管理器/项目规划器。如果有人有空,你可以和我一起去。这是其中的一部分。skype:Dimitar4yyyy该控件实际上只能属于一个父控件,因此如果将其添加到另一个集合,则必须将其从原始集合中删除,否则GUI将无法工作。
    for(int I=0; I < 9; I += 1) {
    this.Controls.Add(data.wizard_tabs.Controls[0].Controls[0]);
    }