为什么这不能将所有控件重置为原始位置



所以,我创建了一个名为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);
            }

最新更新