我试图将所有控件从动态窗体复制到另一个静态声明的窗体。奇怪的是,正好有一半被复制了。代码看起来像这样-
// Constructor of static form
public ApplicationForm(dynamic form)
{
// Add all controls from the dynamic form to the Application form
Console.WriteLine("I have total of {0} controls\n", form.Controls.Count);
int i = 0;
foreach (Control c in form.Controls)
{
i++;
this.Controls.Add(c);
Console.WriteLine(" Number of controls rem {1}\n",
form.Controls.Count);
}
Console.WriteLine("I added a total of {0} controls and still have {1}\n",i,
form.Controls.Count);
}
对于一个特定示例,在循环开始时有56个控件,在循环结束时还剩下27个控件。为了测试,我在第一个循环之后再次添加了相同的for循环。这次还剩下13个。
为什么只添加一半控件?为什么foreach
循环会过早退出?
PS:我之所以这样做,是因为我知道一种捕获动态表格击键的方法。对于静态表单,我可以覆盖ProcessCmdKey
和捕获击键,但是我不知道动态表单有任何等效项
您的假设可能是:
foreach (Control c in form.Controls)
{
this.Controls.Add(c);
}
仅影响一个ControlColection,即上的集合this
。但是,一个控件只能有一个父级。该Add
实现的内部结构揭示了以下内容:
public virtual void Add(Control value)
{
// skipped stuff
if (value.parent != null)
{
value.parent.Controls.Remove(value);
}
base.InnerList.Add(value);
// many more
}
注意该Add
方法如何调用Remove
父控件集合。该InnerList
是ArrayList
。每次将控件添加到其他窗体时,其大小都会在父窗体上减小。因此,您只处理其中的一半。
在开始将控件副本添加到List<Control>
第一个控件之前,然后将列表中的控件添加到ApplicationForm。
// copy controls to list
var list = new List<Control>();
foreach (Control c in form.Controls)
{
list.Add(c);
}
Console.WriteLine("I have total of {0} controls\n", form.Controls.Count);
int i = 0;
// iterate over list
foreach (Control c in list)
{
i++;
this.Controls.Add(c);
Console.WriteLine(" Number of controls rem {1}\n",
form.Controls.Count);
}
Console.WriteLine("I added a total of {0} controls and still have {1}\n",i,
form.Controls.Count);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句