簡體   English   中英

為什么這不能將所有控件重置到原始位置?

[英]Why does this not reset all controls to original position?

因此,我創建了一個名為StatePanel的面板,該面板來自Panel類的繼承,但還有一些額外的字段,例如OrigXPosition和OrigYPosition(均在開始時進行了初始化)。 這些可以從tabPage拖放到組框中。 但是,我希望有一個重置按鈕,每當我按下它時,它就會遍歷每個組框,並帶走每個狀態面板以移回到選項卡控件中的原始位置。 為此,我想到了以下代碼:

    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);
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM