C# WinForms Form.Controls.Add的问题

C# WinForms Form.Controls.Add的问题,c#,winforms,C#,Winforms,Microsoft Visual Studio 2010 Express Windows窗体C# Horay,有关ControlCollections和Form.Controls.Add()的更多问题 为什么突出显示的(带>)行在这个代码段中充当“return;”语句 如果已执行,则调试(3);不跑。我没有解决这个问题的智慧 行本身甚至不执行。移除它可以修复所有问题,所以这就是问题所在 如果你想知道什么数据。代表: namespace Project_Management_Wizard { p

Microsoft Visual Studio 2010 Express Windows窗体C#


Horay,有关ControlCollections和Form.Controls.Add()的更多问题

为什么突出显示的(带>)行在这个代码段中充当“return;”语句

如果已执行,则调试(3);不跑。我没有解决这个问题的智慧

行本身甚至不执行。移除它可以修复所有问题,所以这就是问题所在

如果你想知道什么数据。代表:

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

    }
}


public dataStorage data = new dataStorage();


一开始我没有弄清楚的是ControlCollection只是一个对实际控件的引用数组。复制它只会复制引用。我认为ControlCollection保存了实际的元素,所以我可以通过复制ControlCollection来复制元素。复制ControlCollection不会复制任何集合,因此编辑它指向的集合会产生错误

听起来那行好像抛出了一个异常。尝试在其周围放置一个Try/catch块,然后在catch中放置一个断点,看看它是否确实在抛出

需要检查的事项:

  • mainForm\u startControls
    是否实例化

  • mainForm\u startControls
    是否实际包含4个元素,以便
    mainForm\u startControls[3]
    将返回一个值


听起来那行好像抛出了一个异常。尝试在其周围放置一个Try/catch块,然后在catch中放置一个断点,看看它是否确实在抛出

需要检查的事项:

  • mainForm\u startControls
    是否实例化

  • mainForm\u startControls
    是否实际包含4个元素,以便
    mainForm\u startControls[3]
    将返回一个值


我认为您选择的行会引发异常,因此下一行不会执行


出现异常的原因是data.mainForm_StartControl[3]不存在,因为集合为空。你用这个清除了它。Controls.Clear()。由于this.Controls和data.mainForm\u startControls是相同的指针,Clear方法也会清除data.mainForm\u startControls。

我认为您选择的行会引发异常,因此下一行不会执行


出现异常的原因是data.mainForm_StartControl[3]不存在,因为集合为空。你用这个清除了它。Controls.Clear()。由于this.Controls和data.mainForm\u start控件是相同的指针,因此Clear方法也会清除data.mainForm\u start控件。

当您认为正在创建副本时,您的问题是处理引用赋值

分配
data.main表单_startControl=this.Controls时您正在将引用分配给
此.Controls
数据.mainForm\u startControls
。这是处理C#中任何引用类型的标准。您没有复制集合,只是将其分配给第二个变量

如果修改
此.Controls
,几乎所有更改都将反映在
data.main表单\u startControl
中。事实上,目前我能想到的唯一不会影响
数据.mainForm_startControls
的更改是,如果您实际创建了一个全新的对象并将其分配给
此.Controls

因此,当您调用
this.Controls.Clear()
时,您正在清除ControlCollection对象,并且由于
data.main表单\u startControls
引用了相同的对象,因此您也在清除它

您需要做的是将单个元素分配给新集合,而不是分配整个集合

首先,我建议将dataStorage中的
ControlCollection
更改为更现代的集合,例如
List
。在.NET中处理泛型集合类要容易得多,因为所有内容都是强类型的

public class dataStorage {
    public List<Control> mainForm_startControls = new List<Control>()
    public System.Windows.Forms.Control wizard_tabs;

}

这样,您就有了一个全新的集合,它将保存对每个控件的引用,当您调用
this.controls.Clear()

时,它不会被清除。当您认为正在创建副本时,您的问题是处理引用赋值

分配
data.main表单_startControl=this.Controls时您正在将引用分配给
此.Controls
数据.mainForm\u startControls
。这是处理C#中任何引用类型的标准。您没有复制集合,只是将其分配给第二个变量

如果修改
此.Controls
,几乎所有更改都将反映在
data.main表单\u startControl
中。事实上,目前我能想到的唯一不会影响
数据.mainForm_startControls
的更改是,如果您实际创建了一个全新的对象并将其分配给
此.Controls

因此,当您调用
this.Controls.Clear()
时,您正在清除ControlCollection对象,并且由于
data.main表单\u startControls
引用了相同的对象,因此您也在清除它

您需要做的是将单个元素分配给新集合,而不是分配整个集合

首先,我建议将dataStorage中的
ControlCollection
更改为更现代的集合,例如
List
。在.NET中处理泛型集合类要容易得多,因为所有内容都是强类型的

public class dataStorage {
    public List<Control> mainForm_startControls = new List<Control>()
    public System.Windows.Forms.Control wizard_tabs;

}

这样,您就有了一个全新的集合,它将保存对每个控件的引用,当您调用
this.controls.Clear()

时,它不会被清除。该行会引发一个异常,然后在堆栈上的某个更高点被吞没?是否引发异常?是否确定调试器已附加到正确版本的代码?这里没有任何东西会导致它从函数作用域返回。显然,+$exception{“索引0超出范围。\r\n
foreach (Control item in this.Controls)
{
    data.mainForm_startControls.Add(item);
}