C# WinForms Form.Controls.Add的问题
Microsoft Visual Studio 2010 Express Windows窗体C#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
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
是否实际包含4个元素,以便mainForm\u startControls
将返回一个值mainForm\u startControls[3]
是否实例化mainForm\u startControls
是否实际包含4个元素,以便mainForm\u startControls
将返回一个值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);
}