所以,我创建了一个名为statepanel的面板,该面板从面板类中继承,但是有一些额外的字段,例如origxposition和arigyposition(在开始时是初始化的)。这些可以从选项卡中拖动到组箱中。但是,我想拥有一个重置按钮,每当我按下它时,它都会通过每个组盒,并将每个statepanel带回选项卡控件中的原始位置。为了实现这样做,我提出了此代码:
private void ResetStatePanels()
{
foreach (Control groupBx in tabPageRegions.Controls){
if (groupBx.Name.Substring(0, 2) == "gb")
{
foreach (Control c in groupBx.Controls)
{
StatePanel sp1 = c as StatePanel;
tabPageRegions.Controls.Add(sp1);
sp1.Location = new Point(sp1.OrigXPosition, sp1.OrigYPosition);
}
}
}
}
但是,当我运行该代码时,每个组箱中的每个其他状态箱最终都会回到其原始位置。这很奇怪,因为不仅如此,而且如果我按下调用该功能多次的按钮,每次我按越来越多的次数移回原始位置,直到所有位置都在那里。我在这里做错了什么?
通过您的foreach (Control c in groupBx.Controls)
,您在迭代时删除了集合中的元素,这是一个反图案。
一种解决方案是事先创建另一个集合:
StatePanel[] panels = groupBx.Controls.OfType<StatePanel>().ToArray();
foreach (StatePanel sp1 in panels)
{
tabPageRegions.Controls.Add(sp1);
sp1.Location = new Point(sp1.OrigXPosition, sp1.OrigYPosition);
}